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 = 2;
+ 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) {
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;
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;
&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) {
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;
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);
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,
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++) {
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++) {
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;