Skip to content

Commit

Permalink
st/nine: Allocate more space for ATI1
Browse files Browse the repository at this point in the history
ATIx are "unknown" formats that do not follow block format conventions.
Tests showed that pitch*height bytes are allocated and that
apitrace depends on this behaviour.
Apitrace copies more bytes than it has to for the ATI1 block format,
but it doesn't crash on Windows.

Increase buffersize for ATI1 to fix this crash.
The same issue was present in WINE but a patch has been sent by me.

Signed-off-by: Patrick Rudolph <siro@das-labor.org>
  • Loading branch information
siro20 authored and Axel Davy committed Sep 10, 2016
1 parent 1bdd4b6 commit f737e14
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 6 deletions.
21 changes: 17 additions & 4 deletions src/gallium/state_trackers/nine/nine_pipe.h
Expand Up @@ -44,6 +44,8 @@ void nine_convert_sampler_state(struct cso_context *, int idx, const DWORD *);

void nine_pipe_context_clear(struct NineDevice9 *);

#define is_ATI1_ATI2(format) (format == PIPE_FORMAT_RGTC1_UNORM || format == PIPE_FORMAT_RGTC2_UNORM)

static inline void
rect_to_pipe_box(struct pipe_box *dst, const RECT *src)
{
Expand Down Expand Up @@ -728,8 +730,14 @@ static inline unsigned nine_format_get_level_alloc_size(enum pipe_format format,

w = u_minify(width, level);
h = u_minify(height, level);
size = nine_format_get_stride(format, w) *
util_format_get_nblocksy(format, h);
if (is_ATI1_ATI2(format)) {
/* For "unknown" formats like ATIx use width * height bytes */
size = w * h;
} else {
size = nine_format_get_stride(format, w) *
util_format_get_nblocksy(format, h);
}

return size;
}

Expand All @@ -745,8 +753,13 @@ static inline unsigned nine_format_get_size_and_offsets(enum pipe_format format,
w = u_minify(width, l);
h = u_minify(height, l);
offsets[l] = size;
size += nine_format_get_stride(format, w) *
util_format_get_nblocksy(format, h);
if (is_ATI1_ATI2(format)) {
/* For "unknown" formats like ATIx use width * height bytes */
size += w * h;
} else {
size += nine_format_get_stride(format, w) *
util_format_get_nblocksy(format, h);
}
}

return size;
Expand Down
2 changes: 0 additions & 2 deletions src/gallium/state_trackers/nine/surface9.c
Expand Up @@ -42,8 +42,6 @@

#define DBG_CHANNEL DBG_SURFACE

#define is_ATI1_ATI2(format) (format == PIPE_FORMAT_RGTC1_UNORM || format == PIPE_FORMAT_RGTC2_UNORM)

HRESULT
NineSurface9_ctor( struct NineSurface9 *This,
struct NineUnknownParams *pParams,
Expand Down

0 comments on commit f737e14

Please sign in to comment.