we need to know the aligned height when binding the surface to cb/zb, not the gallium surface height.tags/snb-magic
@@ -740,6 +740,7 @@ static void evergreen_cb(struct r600_pipe_context *rctx, struct r600_pipe_state | |||
{ | |||
struct r600_resource_texture *rtex; | |||
struct r600_resource *rbuffer; | |||
struct r600_surface *surf; | |||
unsigned level = state->cbufs[cb]->level; | |||
unsigned pitch, slice; | |||
unsigned color_info; | |||
@@ -747,6 +748,7 @@ static void evergreen_cb(struct r600_pipe_context *rctx, struct r600_pipe_state | |||
const struct util_format_description *desc; | |||
struct r600_bo *bo[3]; | |||
surf = (struct r600_surface *)state->cbufs[cb]; | |||
rtex = (struct r600_resource_texture*)state->cbufs[cb]->texture; | |||
rbuffer = &rtex->resource; | |||
bo[0] = rbuffer->bo; | |||
@@ -754,7 +756,7 @@ static void evergreen_cb(struct r600_pipe_context *rctx, struct r600_pipe_state | |||
bo[2] = rbuffer->bo; | |||
pitch = rtex->pitch_in_pixels[level] / 8 - 1; | |||
slice = rtex->pitch_in_pixels[level] * state->cbufs[cb]->height / 64 - 1; | |||
slice = rtex->pitch_in_pixels[level] * surf->aligned_height / 64 - 1; | |||
ntype = 0; | |||
desc = util_format_description(rtex->resource.base.b.format); | |||
if (desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB) | |||
@@ -801,6 +803,7 @@ static void evergreen_db(struct r600_pipe_context *rctx, struct r600_pipe_state | |||
{ | |||
struct r600_resource_texture *rtex; | |||
struct r600_resource *rbuffer; | |||
struct r600_surface *surf; | |||
unsigned level; | |||
unsigned pitch, slice, format, stencil_format; | |||
@@ -809,6 +812,7 @@ static void evergreen_db(struct r600_pipe_context *rctx, struct r600_pipe_state | |||
level = state->zsbuf->level; | |||
surf = (struct r600_surface *)state->zsbuf; | |||
rtex = (struct r600_resource_texture*)state->zsbuf->texture; | |||
rtex->tiled = 1; | |||
rtex->array_mode[level] = 2; | |||
@@ -817,7 +821,7 @@ static void evergreen_db(struct r600_pipe_context *rctx, struct r600_pipe_state | |||
rbuffer = &rtex->resource; | |||
pitch = rtex->pitch_in_pixels[level] / 8 - 1; | |||
slice = rtex->pitch_in_pixels[level] * state->zsbuf->height / 64 - 1; | |||
slice = rtex->pitch_in_pixels[level] * surf->aligned_height / 64 - 1; | |||
format = r600_translate_dbformat(state->zsbuf->texture->format); | |||
stencil_format = r600_translate_stencilformat(state->zsbuf->texture->format); | |||
@@ -829,7 +833,7 @@ static void evergreen_db(struct r600_pipe_context *rctx, struct r600_pipe_state | |||
if (stencil_format) { | |||
uint32_t stencil_offset; | |||
stencil_offset = ((state->zsbuf->height * rtex->pitch_in_bytes[level]) + 255) & ~255; | |||
stencil_offset = ((surf->aligned_height * rtex->pitch_in_bytes[level]) + 255) & ~255; | |||
r600_pipe_state_add_reg(rstate, R_02804C_DB_STENCIL_READ_BASE, | |||
(state->zsbuf->offset + stencil_offset + r600_bo_offset(rbuffer->bo)) >> 8, 0xFFFFFFFF, rbuffer->bo); | |||
r600_pipe_state_add_reg(rstate, R_028054_DB_STENCIL_WRITE_BASE, |
@@ -124,4 +124,9 @@ void* r600_texture_transfer_map(struct pipe_context *ctx, | |||
void r600_texture_transfer_unmap(struct pipe_context *ctx, | |||
struct pipe_transfer* transfer); | |||
struct r600_surface { | |||
struct pipe_surface base; | |||
unsigned aligned_height; | |||
}; | |||
#endif |
@@ -950,6 +950,7 @@ static void r600_cb(struct r600_pipe_context *rctx, struct r600_pipe_state *rsta | |||
{ | |||
struct r600_resource_texture *rtex; | |||
struct r600_resource *rbuffer; | |||
struct r600_surface *surf; | |||
unsigned level = state->cbufs[cb]->level; | |||
unsigned pitch, slice; | |||
unsigned color_info; | |||
@@ -957,6 +958,7 @@ static void r600_cb(struct r600_pipe_context *rctx, struct r600_pipe_state *rsta | |||
const struct util_format_description *desc; | |||
struct r600_bo *bo[3]; | |||
surf = (struct r600_surface *)state->cbufs[cb]; | |||
rtex = (struct r600_resource_texture*)state->cbufs[cb]->texture; | |||
rbuffer = &rtex->resource; | |||
bo[0] = rbuffer->bo; | |||
@@ -964,7 +966,7 @@ static void r600_cb(struct r600_pipe_context *rctx, struct r600_pipe_state *rsta | |||
bo[2] = rbuffer->bo; | |||
pitch = rtex->pitch_in_pixels[level] / 8 - 1; | |||
slice = rtex->pitch_in_pixels[level] * state->cbufs[cb]->height / 64 - 1; | |||
slice = rtex->pitch_in_pixels[level] * surf->aligned_height / 64 - 1; | |||
ntype = 0; | |||
desc = util_format_description(rtex->resource.base.b.format); | |||
if (desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB) | |||
@@ -1010,6 +1012,7 @@ static void r600_db(struct r600_pipe_context *rctx, struct r600_pipe_state *rsta | |||
{ | |||
struct r600_resource_texture *rtex; | |||
struct r600_resource *rbuffer; | |||
struct r600_surface *surf; | |||
unsigned level; | |||
unsigned pitch, slice, format; | |||
@@ -1018,6 +1021,7 @@ static void r600_db(struct r600_pipe_context *rctx, struct r600_pipe_state *rsta | |||
level = state->zsbuf->level; | |||
surf = (struct r600_surface *)state->zsbuf; | |||
rtex = (struct r600_resource_texture*)state->zsbuf->texture; | |||
rtex->tiled = 1; | |||
rtex->array_mode[level] = 2; | |||
@@ -1026,7 +1030,7 @@ static void r600_db(struct r600_pipe_context *rctx, struct r600_pipe_state *rsta | |||
rbuffer = &rtex->resource; | |||
pitch = rtex->pitch_in_pixels[level] / 8 - 1; | |||
slice = rtex->pitch_in_pixels[level] * state->zsbuf->height / 64 - 1; | |||
slice = rtex->pitch_in_pixels[level] * surf->aligned_height / 64 - 1; | |||
format = r600_translate_dbformat(state->zsbuf->texture->format); | |||
r600_pipe_state_add_reg(rstate, R_02800C_DB_DEPTH_BASE, | |||
@@ -1039,7 +1043,7 @@ static void r600_db(struct r600_pipe_context *rctx, struct r600_pipe_state *rsta | |||
S_028010_ARRAY_MODE(rtex->array_mode[level]) | S_028010_FORMAT(format), | |||
0xFFFFFFFF, rbuffer->bo); | |||
r600_pipe_state_add_reg(rstate, R_028D34_DB_PREFETCH_LIMIT, | |||
(state->zsbuf->height / 8) - 1, 0xFFFFFFFF, NULL); | |||
(surf->aligned_height / 8) - 1, 0xFFFFFFFF, NULL); | |||
} | |||
static void r600_set_framebuffer_state(struct pipe_context *ctx, |
@@ -279,24 +279,27 @@ static struct pipe_surface *r600_get_tex_surface(struct pipe_screen *screen, | |||
unsigned zslice, unsigned flags) | |||
{ | |||
struct r600_resource_texture *rtex = (struct r600_resource_texture*)texture; | |||
struct pipe_surface *surface = CALLOC_STRUCT(pipe_surface); | |||
unsigned offset; | |||
struct r600_surface *surface = CALLOC_STRUCT(r600_surface); | |||
unsigned offset, tile_height; | |||
if (surface == NULL) | |||
return NULL; | |||
offset = r600_texture_get_offset(rtex, level, zslice, face); | |||
pipe_reference_init(&surface->reference, 1); | |||
pipe_resource_reference(&surface->texture, texture); | |||
surface->format = texture->format; | |||
surface->width = mip_minify(texture->width0, level); | |||
surface->height = mip_minify(texture->height0, level); | |||
surface->offset = offset; | |||
surface->usage = flags; | |||
surface->zslice = zslice; | |||
surface->texture = texture; | |||
surface->face = face; | |||
surface->level = level; | |||
return surface; | |||
pipe_reference_init(&surface->base.reference, 1); | |||
pipe_resource_reference(&surface->base.texture, texture); | |||
surface->base.format = texture->format; | |||
surface->base.width = mip_minify(texture->width0, level); | |||
surface->base.height = mip_minify(texture->height0, level); | |||
surface->base.offset = offset; | |||
surface->base.usage = flags; | |||
surface->base.zslice = zslice; | |||
surface->base.texture = texture; | |||
surface->base.face = face; | |||
surface->base.level = level; | |||
tile_height = r600_get_height_alignment(screen, rtex->array_mode[level]); | |||
surface->aligned_height = align(surface->base.height, tile_height); | |||
return &surface->base; | |||
} | |||
static void r600_tex_surface_destroy(struct pipe_surface *surface) |