radeonsi: Replace more magic numbers for sampler state.
[mesa.git] / src / gallium / drivers / radeonsi / evergreen_state.c
index 5049c7b2db6bde75ebc07925651b2c1d50b9f0b6..ee95275377b40807f4962e0290239ddac6d258d9 100644 (file)
@@ -1120,34 +1120,34 @@ static void *si_create_sampler_state(struct pipe_context *ctx,
 
        util_pack_color(state->border_color.f, PIPE_FORMAT_B8G8R8A8_UNORM, &uc);
        switch (uc.ui) {
-       case 0x000000FF: /* opaque black */
-               border_color_type = 0;
+       case 0x000000FF:
+               border_color_type = V_008F3C_SQ_TEX_BORDER_COLOR_OPAQUE_BLACK;
                break;
-       case 0x00000000: /* transparent black */
-               border_color_type = 1;
+       case 0x00000000:
+               border_color_type = V_008F3C_SQ_TEX_BORDER_COLOR_TRANS_BLACK;
                break;
-       case 0xFFFFFFFF: /* white */
-               border_color_type = 1;
+       case 0xFFFFFFFF:
+               border_color_type = V_008F3C_SQ_TEX_BORDER_COLOR_OPAQUE_WHITE;
                break;
        default: /* Use border color pointer */
-               border_color_type = 3;
-       }
-
-       rstate->val[0] = si_tex_wrap(state->wrap_s) |
-                        si_tex_wrap(state->wrap_t) << 3 |
-                        si_tex_wrap(state->wrap_r) << 6 |
-                        (state->max_anisotropy & 0x7) << 9 | /* XXX */
-                        si_tex_compare(state->compare_func) << 12 |
-                        !state->normalized_coords << 15 |
-                        aniso_flag_offset << 16 | /* XXX */
-                        !state->seamless_cube_map << 28 |
-                        si_tex_mipfilter(state->min_mip_filter) << 29;
-       rstate->val[1] = S_FIXED(CLAMP(state->min_lod, 0, 15), 8) |
-                        S_FIXED(CLAMP(state->max_lod, 0, 15), 8) << 12;
-       rstate->val[2] = S_FIXED(CLAMP(state->lod_bias, -16, 16), 8) |
-                        si_tex_filter(state->mag_img_filter) << 20 |
-                        si_tex_filter(state->min_img_filter) << 22;
-       rstate->val[3] = border_color_type << 30;
+               border_color_type = V_008F3C_SQ_TEX_BORDER_COLOR_REGISTER;
+       }
+
+       rstate->val[0] = (S_008F30_CLAMP_X(si_tex_wrap(state->wrap_s)) |
+                         S_008F30_CLAMP_Y(si_tex_wrap(state->wrap_t)) |
+                         S_008F30_CLAMP_Z(si_tex_wrap(state->wrap_r)) |
+                         (state->max_anisotropy & 0x7) << 9 | /* XXX */
+                         S_008F30_DEPTH_COMPARE_FUNC(si_tex_compare(state->compare_func)) |
+                         S_008F30_FORCE_UNNORMALIZED(!state->normalized_coords) |
+                         aniso_flag_offset << 16 | /* XXX */
+                         S_008F30_DISABLE_CUBE_WRAP(!state->seamless_cube_map));
+       rstate->val[1] = (S_008F34_MIN_LOD(S_FIXED(CLAMP(state->min_lod, 0, 15), 8)) |
+                         S_008F34_MAX_LOD(S_FIXED(CLAMP(state->max_lod, 0, 15), 8)));
+       rstate->val[2] = (S_008F38_LOD_BIAS(S_FIXED(CLAMP(state->lod_bias, -16, 16), 8)) |
+                         S_008F38_XY_MAG_FILTER(si_tex_filter(state->mag_img_filter)) |
+                         S_008F38_XY_MIN_FILTER(si_tex_filter(state->min_img_filter)) |
+                         S_008F38_MIP_FILTER(si_tex_mipfilter(state->min_mip_filter)));
+       rstate->val[3] = S_008F3C_BORDER_COLOR_TYPE(border_color_type);
 
 #if 0
        if (border_color_type == 3) {
@@ -1246,8 +1246,7 @@ static struct pipe_sampler_view *evergreen_create_sampler_view(struct pipe_conte
        height = texture->height0;
        depth = texture->depth0;
 
-       pitch = align(tmp->pitch_in_blocks[0] *
-                     util_format_get_blockwidth(state->format), 8);
+       pitch = tmp->pitch_in_blocks[0] * util_format_get_blockwidth(state->format);
        array_mode = tmp->array_mode[0];
        tile_type = tmp->tile_type;
 
@@ -1271,9 +1270,9 @@ static struct pipe_sampler_view *evergreen_create_sampler_view(struct pipe_conte
                          S_008F1C_DST_SEL_W(si_map_swizzle(swizzle[3])) |
                          S_008F1C_BASE_LEVEL(state->u.tex.first_level) |
                          S_008F1C_LAST_LEVEL(state->u.tex.last_level) |
+                         S_008F1C_TILING_INDEX(8) | /* XXX */
                          S_008F1C_TYPE(si_tex_dim(texture->target)));
-       view->state[4] = (S_008F20_DEPTH(depth - 1) |
-                         S_008F20_PITCH((pitch / 8) - 1));
+       view->state[4] = (S_008F20_DEPTH(depth - 1) | S_008F20_PITCH(pitch - 1));
        view->state[5] = (S_008F24_BASE_ARRAY(state->u.tex.first_layer) |
                          S_008F24_LAST_ARRAY(state->u.tex.last_layer));
        view->state[6] = 0;
@@ -1607,12 +1606,13 @@ static void evergreen_cb(struct r600_context *rctx, struct r600_pipe_state *rsta
                                &rtex->resource, RADEON_USAGE_READWRITE);
 }
 
-static void evergreen_db(struct r600_context *rctx, struct r600_pipe_state *rstate,
-                        const struct pipe_framebuffer_state *state)
+static void si_db(struct r600_context *rctx, struct r600_pipe_state *rstate,
+                 const struct pipe_framebuffer_state *state)
 {
        struct r600_resource_texture *rtex;
        struct r600_surface *surf;
-       unsigned level, first_layer, pitch, slice, format, array_mode;
+       unsigned level, first_layer, pitch, slice, format;
+       uint32_t db_z_info, stencil_info;
        uint64_t offset;
 
        if (state->zsbuf == NULL) {
@@ -1625,10 +1625,6 @@ static void evergreen_db(struct r600_context *rctx, struct r600_pipe_state *rsta
        level = surf->base.u.tex.level;
        rtex = (struct r600_resource_texture*)surf->base.texture;
 
-       /* XXX remove this once tiling is properly supported */
-       array_mode = 0;/*rtex->array_mode[level] ? rtex->array_mode[level] :
-                        V_028C70_ARRAY_1D_TILED_THIN1;*/
-
        first_layer = surf->base.u.tex.first_layer;
        offset = r600_texture_get_offset(rtex, level, first_layer);
        pitch = rtex->pitch_in_blocks[level] / 8 - 1;
@@ -1644,6 +1640,24 @@ static void evergreen_db(struct r600_context *rctx, struct r600_pipe_state *rsta
                                offset, &rtex->resource, RADEON_USAGE_READWRITE);
        r600_pipe_state_add_reg(rstate, R_028008_DB_DEPTH_VIEW, 0x00000000, NULL, 0);
 
+       db_z_info = S_028040_FORMAT(format);
+       stencil_info = S_028044_FORMAT(rtex->stencil != 0);
+
+       switch (format) {
+       case V_028040_Z_16:
+               db_z_info |= S_028040_TILE_MODE_INDEX(5);
+               stencil_info |= S_028044_TILE_MODE_INDEX(5);
+               break;
+       case V_028040_Z_24:
+       case V_028040_Z_32_FLOAT:
+               db_z_info |= S_028040_TILE_MODE_INDEX(6);
+               stencil_info |= S_028044_TILE_MODE_INDEX(6);
+               break;
+       default:
+               db_z_info |= S_028040_TILE_MODE_INDEX(7);
+               stencil_info |= S_028044_TILE_MODE_INDEX(7);
+       }
+
        if (rtex->stencil) {
                uint64_t stencil_offset =
                        r600_texture_get_offset(rtex->stencil, level, first_layer);
@@ -1656,22 +1670,25 @@ static void evergreen_db(struct r600_context *rctx, struct r600_pipe_state *rsta
                r600_pipe_state_add_reg(rstate, R_028054_DB_STENCIL_WRITE_BASE,
                                        stencil_offset, &rtex->stencil->resource, RADEON_USAGE_READWRITE);
                r600_pipe_state_add_reg(rstate, R_028044_DB_STENCIL_INFO,
-                                       1, NULL, 0);
+                                       stencil_info, NULL, 0);
        } else {
                r600_pipe_state_add_reg(rstate, R_028044_DB_STENCIL_INFO,
                                        0, NULL, 0);
        }
 
-       r600_pipe_state_add_reg(rstate, R_02803C_DB_DEPTH_INFO, 0x1, NULL, 0);
-       r600_pipe_state_add_reg(rstate, R_028040_DB_Z_INFO,
-                               /*S_028040_ARRAY_MODE(array_mode) |*/ S_028040_FORMAT(format),
-                               NULL, 0);
-       r600_pipe_state_add_reg(rstate, R_028058_DB_DEPTH_SIZE,
-                               S_028058_PITCH_TILE_MAX(pitch),
-                               NULL, 0);
-       r600_pipe_state_add_reg(rstate, R_02805C_DB_DEPTH_SLICE,
-                               S_02805C_SLICE_TILE_MAX(slice),
-                               NULL, 0);
+       if (format != ~0U) {
+               r600_pipe_state_add_reg(rstate, R_02803C_DB_DEPTH_INFO, 0x1, NULL, 0);
+               r600_pipe_state_add_reg(rstate, R_028040_DB_Z_INFO, db_z_info, NULL, 0);
+               r600_pipe_state_add_reg(rstate, R_028058_DB_DEPTH_SIZE,
+                                       S_028058_PITCH_TILE_MAX(pitch),
+                                       NULL, 0);
+               r600_pipe_state_add_reg(rstate, R_02805C_DB_DEPTH_SLICE,
+                                       S_02805C_SLICE_TILE_MAX(slice),
+                                       NULL, 0);
+
+       } else {
+               r600_pipe_state_add_reg(rstate, R_028040_DB_Z_INFO, 0, NULL, 0);
+       }
 }
 
 static void evergreen_set_framebuffer_state(struct pipe_context *ctx,
@@ -1698,7 +1715,7 @@ static void evergreen_set_framebuffer_state(struct pipe_context *ctx,
        for (int i = 0; i < state->nr_cbufs; i++) {
                evergreen_cb(rctx, rstate, state, i);
        }
-       evergreen_db(rctx, rstate, state);
+       si_db(rctx, rstate, state);
 
        shader_mask = 0;
        for (int i = 0; i < state->nr_cbufs; i++) {
@@ -1923,21 +1940,13 @@ void si_pipe_shader_ps(struct pipe_context *ctx, struct si_pipe_shader *shader)
 
        db_shader_control = S_02880C_Z_ORDER(V_02880C_EARLY_Z_THEN_LATE_Z);
        for (i = 0; i < rshader->ninput; i++) {
-               /* evergreen NUM_INTERP only contains values interpolated into the LDS,
-                  POSITION goes via GPRs from the SC so isn't counted */
-               if (rshader->input[i].name == TGSI_SEMANTIC_POSITION)
-                       pos_index = i;
-               else if (rshader->input[i].name == TGSI_SEMANTIC_FACE)
-                       face_index = i;
-               else {
-                       ninterp++;
-                       if (rshader->input[i].interpolate == TGSI_INTERPOLATE_LINEAR)
-                               have_linear = TRUE;
-                       if (rshader->input[i].interpolate == TGSI_INTERPOLATE_PERSPECTIVE)
-                               have_perspective = TRUE;
-                       if (rshader->input[i].centroid)
-                               have_centroid = TRUE;
-               }
+               ninterp++;
+               if (rshader->input[i].interpolate == TGSI_INTERPOLATE_LINEAR)
+                       have_linear = TRUE;
+               if (rshader->input[i].interpolate == TGSI_INTERPOLATE_PERSPECTIVE)
+                       have_perspective = TRUE;
+               if (rshader->input[i].centroid)
+                       have_centroid = TRUE;
        }
 
        for (i = 0; i < rshader->noutput; i++) {
@@ -1967,14 +1976,6 @@ void si_pipe_shader_ps(struct pipe_context *ctx, struct si_pipe_shader *shader)
                exports_ps = 2;
        }
 
-       if (ninterp == 0) {
-               ninterp = 1;
-               have_perspective = TRUE;
-       }
-
-       if (!have_perspective && !have_linear)
-               have_perspective = TRUE;
-
        spi_ps_in_control = S_0286D8_NUM_INTERP(ninterp);
 
        spi_baryc_cntl = 0;