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) | |||