r600g: add r600 surface to store the aligned height.
authorDave Airlie <airlied@redhat.com>
Thu, 21 Oct 2010 03:31:27 +0000 (13:31 +1000)
committerDave Airlie <airlied@redhat.com>
Thu, 21 Oct 2010 03:33:00 +0000 (13:33 +1000)
we need to know the aligned height when binding the surface to cb/zb,
not the gallium surface height.

src/gallium/drivers/r600/evergreen_state.c
src/gallium/drivers/r600/r600_resource.h
src/gallium/drivers/r600/r600_state.c
src/gallium/drivers/r600/r600_texture.c

index 026d93555869c8dcf150f3df69d5baa9d5aaafb4..0b54c2c7167aab3b13a7d14455577ce7723db32f 100644 (file)
@@ -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,
index d34a8edac2badbbeec6bec48f27f2e92c256fd25..5d9fe8cf9448942cf460a4fd7990a48d3795269a 100644 (file)
@@ -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
index 7775619c04b231ce293be93a9f86c783cb7f93b9..bab3f224d7dd1101b35e227de44e21279ca46057 100644 (file)
@@ -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,
index a90fc0382f1093d908b0d4ca94e395f0b11857ce..c765c0c87a1e1d01068893083fb1825a3386e902 100644 (file)
@@ -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)