r600g: move to per-miplevel array mode.
authorDave Airlie <airlied@redhat.com>
Thu, 21 Oct 2010 03:26:04 +0000 (13:26 +1000)
committerDave Airlie <airlied@redhat.com>
Thu, 21 Oct 2010 03:32:08 +0000 (13:32 +1000)
Since the hw transitions from 2D->1D sampling below the 2D macrotile
size we need to keep track of the array mode per level so we can
render to it using the CB.

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 ce34ed4ad3c76c712d67c2c59614edd187de9b55..026d93555869c8dcf150f3df69d5baa9d5aaafb4 100644 (file)
@@ -807,14 +807,15 @@ static void evergreen_db(struct r600_pipe_context *rctx, struct r600_pipe_state
        if (state->zsbuf == NULL)
                return;
 
+       level = state->zsbuf->level;
+
        rtex = (struct r600_resource_texture*)state->zsbuf->texture;
        rtex->tiled = 1;
-       rtex->array_mode = 2;
+       rtex->array_mode[level] = 2;
        rtex->tile_type = 1;
        rtex->depth = 1;
        rbuffer = &rtex->resource;
 
-       level = state->zsbuf->level;
        pitch = rtex->pitch_in_pixels[level] / 8 - 1;
        slice = rtex->pitch_in_pixels[level] * state->zsbuf->height / 64 - 1;
        format = r600_translate_dbformat(state->zsbuf->texture->format);
@@ -840,7 +841,7 @@ static void evergreen_db(struct r600_pipe_context *rctx, struct r600_pipe_state
                                S_028044_FORMAT(stencil_format), 0xFFFFFFFF, rbuffer->bo);
 
        r600_pipe_state_add_reg(rstate, R_028040_DB_Z_INFO,
-                               S_028040_ARRAY_MODE(rtex->array_mode) | S_028040_FORMAT(format),
+                               S_028040_ARRAY_MODE(rtex->array_mode[level]) | S_028040_FORMAT(format),
                                0xFFFFFFFF, rbuffer->bo);
        r600_pipe_state_add_reg(rstate, R_028058_DB_DEPTH_SIZE,
                                S_028058_PITCH_TILE_MAX(pitch),
index ef484aba4a2fa10c9435a773c7c568e04bfc4d27..d34a8edac2badbbeec6bec48f27f2e92c256fd25 100644 (file)
@@ -53,10 +53,10 @@ struct r600_resource_texture {
        unsigned                        pitch_in_bytes[PIPE_MAX_TEXTURE_LEVELS];
        unsigned                        pitch_in_pixels[PIPE_MAX_TEXTURE_LEVELS];
        unsigned                        layer_size[PIPE_MAX_TEXTURE_LEVELS];
+       unsigned                        array_mode[PIPE_MAX_TEXTURE_LEVELS];
        unsigned                        pitch_override;
        unsigned                        size;
        unsigned                        tiled;
-       unsigned                        array_mode;
        unsigned                        tile_type;
        unsigned                        depth;
        unsigned                        dirty;
index 81d25b5420309681e60d3de9f19fcf5ca9e68d0d..7775619c04b231ce293be93a9f86c783cb7f93b9 100644 (file)
@@ -658,7 +658,7 @@ static struct pipe_sampler_view *r600_create_sampler_view(struct pipe_context *c
        }
        pitch = align(tmp->pitch_in_pixels[0], 8);
        if (tmp->tiled) {
-               array_mode = tmp->array_mode;
+               array_mode = tmp->array_mode[0];
                tile_type = tmp->tile_type;
        }
 
@@ -974,7 +974,7 @@ static void r600_cb(struct r600_pipe_context *rctx, struct r600_pipe_state *rsta
        swap = r600_translate_colorswap(rtex->resource.base.b.format);
        color_info = S_0280A0_FORMAT(format) |
                S_0280A0_COMP_SWAP(swap) |
-               S_0280A0_ARRAY_MODE(rtex->array_mode) |
+               S_0280A0_ARRAY_MODE(rtex->array_mode[level]) |
                S_0280A0_BLEND_CLAMP(1) |
                S_0280A0_NUMBER_TYPE(ntype);
        if (desc->colorspace != UTIL_FORMAT_COLORSPACE_ZS) 
@@ -1016,14 +1016,15 @@ static void r600_db(struct r600_pipe_context *rctx, struct r600_pipe_state *rsta
        if (state->zsbuf == NULL)
                return;
 
+       level = state->zsbuf->level;
+
        rtex = (struct r600_resource_texture*)state->zsbuf->texture;
        rtex->tiled = 1;
-       rtex->array_mode = 2;
+       rtex->array_mode[level] = 2;
        rtex->tile_type = 1;
        rtex->depth = 1;
        rbuffer = &rtex->resource;
 
-       level = state->zsbuf->level;
        pitch = rtex->pitch_in_pixels[level] / 8 - 1;
        slice = rtex->pitch_in_pixels[level] * state->zsbuf->height / 64 - 1;
        format = r600_translate_dbformat(state->zsbuf->texture->format);
@@ -1035,7 +1036,7 @@ static void r600_db(struct r600_pipe_context *rctx, struct r600_pipe_state *rsta
                                0xFFFFFFFF, NULL);
        r600_pipe_state_add_reg(rstate, R_028004_DB_DEPTH_VIEW, 0x00000000, 0xFFFFFFFF, NULL);
        r600_pipe_state_add_reg(rstate, R_028010_DB_DEPTH_INFO,
-                               S_028010_ARRAY_MODE(rtex->array_mode) | S_028010_FORMAT(format),
+                               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);
index b9348baf0db62d19dfd6eebe6f9deeeba9eaac8c..b36f8236081bbd8d75d34e01f1060de003ab0663 100644 (file)
@@ -142,8 +142,16 @@ static unsigned pitch_to_width(enum pipe_format format,
             util_format_get_blockwidth(format);
 }
 
+static void r600_texture_set_array_mode(struct pipe_screen *screen,
+                                       struct r600_resource_texture *rtex,
+                                       unsigned level, unsigned array_mode)
+{
+       rtex->array_mode[level] = array_mode;
+}
+
 static void r600_setup_miptree(struct pipe_screen *screen,
-                              struct r600_resource_texture *rtex)
+                              struct r600_resource_texture *rtex,
+                              unsigned array_mode)
 {
        struct pipe_resource *ptex = &rtex->resource.base.b;
        struct radeon *radeon = (struct radeon *)screen->winsys;
@@ -152,6 +160,8 @@ static void r600_setup_miptree(struct pipe_screen *screen,
        unsigned nblocksy;
 
        for (i = 0, offset = 0; i <= ptex->last_level; i++) {
+               r600_texture_set_array_mode(screen, rtex, i, array_mode);
+
                pitch = r600_texture_get_stride(screen, rtex, i);
                nblocksy = r600_texture_get_nblocksy(screen, rtex, i);
 
@@ -198,11 +208,10 @@ r600_texture_create_object(struct pipe_screen *screen,
        resource->bo = bo;
        resource->domain = r600_domain_from_usage(resource->base.b.bind);
        rtex->pitch_override = pitch_in_bytes_override;
-       rtex->array_mode = array_mode;
 
        if (array_mode)
                rtex->tiled = 1;
-       r600_setup_miptree(screen, rtex);
+       r600_setup_miptree(screen, rtex, array_mode);
 
        resource->size = rtex->size;