r300g: fix glsl-fs-pointcoord
Move GB_ENABLE to derived rs state, and find sprite coord for the correct generic and enable the tex coord for that generic. Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
parent
048bda175b
commit
81b7de5bf0
|
@ -125,6 +125,8 @@ struct r300_gpu_flush {
|
|||
uint32_t cb_flush_clean[6];
|
||||
};
|
||||
|
||||
#define RS_STATE_MAIN_SIZE 23
|
||||
|
||||
struct r300_rs_state {
|
||||
/* Original rasterizer state. */
|
||||
struct pipe_rasterizer_state rs;
|
||||
|
@ -132,7 +134,7 @@ struct r300_rs_state {
|
|||
struct pipe_rasterizer_state rs_draw;
|
||||
|
||||
/* Command buffers. */
|
||||
uint32_t cb_main[25];
|
||||
uint32_t cb_main[RS_STATE_MAIN_SIZE];
|
||||
uint32_t cb_poly_offset_zb16[5];
|
||||
uint32_t cb_poly_offset_zb24[5];
|
||||
|
||||
|
@ -150,6 +152,7 @@ struct r300_rs_block {
|
|||
uint32_t vap_vtx_state_cntl; /* R300_VAP_VTX_STATE_CNTL: 0x2180 */
|
||||
uint32_t vap_vsm_vtx_assm; /* R300_VAP_VSM_VTX_ASSM: 0x2184 */
|
||||
uint32_t vap_out_vtx_fmt[2]; /* R300_VAP_OUTPUT_VTX_FMT_[0-1]: 0x2090 */
|
||||
uint32_t gb_enable;
|
||||
|
||||
uint32_t ip[8]; /* R300_RS_IP_[0-7], R500_RS_IP_[0-7] */
|
||||
uint32_t count; /* R300_RS_COUNT */
|
||||
|
|
|
@ -667,7 +667,7 @@ void r300_emit_rs_state(struct r300_context* r300, unsigned size, void* state)
|
|||
CS_LOCALS(r300);
|
||||
|
||||
BEGIN_CS(size);
|
||||
OUT_CS_TABLE(rs->cb_main, 25);
|
||||
OUT_CS_TABLE(rs->cb_main, RS_STATE_MAIN_SIZE);
|
||||
if (rs->polygon_offset_enable) {
|
||||
if (r300->zbuffer_bpp == 16) {
|
||||
OUT_CS_TABLE(rs->cb_poly_offset_zb16, 5);
|
||||
|
@ -709,6 +709,8 @@ void r300_emit_rs_block_state(struct r300_context* r300,
|
|||
OUT_CS_REG_SEQ(R300_VAP_OUTPUT_VTX_FMT_0, 2);
|
||||
OUT_CS(rs->vap_out_vtx_fmt[0]);
|
||||
OUT_CS(rs->vap_out_vtx_fmt[1]);
|
||||
OUT_CS_REG_SEQ(R300_GB_ENABLE, 1);
|
||||
OUT_CS(rs->gb_enable);
|
||||
|
||||
if (r300->screen->caps.is_r500) {
|
||||
OUT_CS_REG_SEQ(R500_RS_IP_0, count);
|
||||
|
|
|
@ -935,10 +935,6 @@ static void* r300_create_rs_state(struct pipe_context* pipe,
|
|||
uint32_t polygon_mode; /* R300_GA_POLY_MODE: 0x4288 */
|
||||
uint32_t clip_rule; /* R300_SC_CLIP_RULE: 0x43D0 */
|
||||
|
||||
/* Specifies top of Raster pipe specific enable controls,
|
||||
* i.e. texture coordinates stuffing for points, lines, triangles */
|
||||
uint32_t stuffing_enable; /* R300_GB_ENABLE: 0x4008 */
|
||||
|
||||
/* Point sprites texture coordinates, 0: lower left, 1: upper right */
|
||||
float point_texcoord_left = 0; /* R300_GA_POINT_S0: 0x4200 */
|
||||
float point_texcoord_bottom = 0;/* R300_GA_POINT_T0: 0x4204 */
|
||||
|
@ -1052,16 +1048,8 @@ static void* r300_create_rs_state(struct pipe_context* pipe,
|
|||
|
||||
clip_rule = state->scissor ? 0xAAAA : 0xFFFF;
|
||||
|
||||
/* Point sprites */
|
||||
stuffing_enable = 0;
|
||||
/* Point sprites coord mode */
|
||||
if (rs->rs.sprite_coord_enable) {
|
||||
stuffing_enable = R300_GB_POINT_STUFF_ENABLE;
|
||||
for (i = 0; i < 8; i++) {
|
||||
if (rs->rs.sprite_coord_enable & (1 << i))
|
||||
stuffing_enable |=
|
||||
R300_GB_TEX_ST << (R300_GB_TEX0_SOURCE_SHIFT + (i*2));
|
||||
}
|
||||
|
||||
switch (state->sprite_coord_mode) {
|
||||
case PIPE_SPRITE_COORD_UPPER_LEFT:
|
||||
point_texcoord_top = 0.0f;
|
||||
|
@ -1075,7 +1063,7 @@ static void* r300_create_rs_state(struct pipe_context* pipe,
|
|||
}
|
||||
|
||||
/* Build the main command buffer. */
|
||||
BEGIN_CB(rs->cb_main, 25);
|
||||
BEGIN_CB(rs->cb_main, RS_STATE_MAIN_SIZE);
|
||||
OUT_CB_REG(R300_VAP_CNTL_STATUS, vap_control_status);
|
||||
OUT_CB_REG(R300_GA_POINT_SIZE, point_size);
|
||||
OUT_CB_REG_SEQ(R300_GA_POINT_MINMAX, 2);
|
||||
|
@ -1089,7 +1077,6 @@ static void* r300_create_rs_state(struct pipe_context* pipe,
|
|||
OUT_CB_REG(R300_GA_LINE_STIPPLE_VALUE, line_stipple_value);
|
||||
OUT_CB_REG(R300_GA_POLY_MODE, polygon_mode);
|
||||
OUT_CB_REG(R300_SC_CLIP_RULE, clip_rule);
|
||||
OUT_CB_REG(R300_GB_ENABLE, stuffing_enable);
|
||||
OUT_CB_REG_SEQ(R300_GA_POINT_S0, 4);
|
||||
OUT_CB_32F(point_texcoord_left);
|
||||
OUT_CB_32F(point_texcoord_bottom);
|
||||
|
@ -1147,7 +1134,7 @@ static void r300_bind_rs_state(struct pipe_context* pipe, void* state)
|
|||
}
|
||||
|
||||
UPDATE_STATE(state, r300->rs_state);
|
||||
r300->rs_state.size = 25 + (r300->polygon_offset_enabled ? 5 : 0);
|
||||
r300->rs_state.size = RS_STATE_MAIN_SIZE + (r300->polygon_offset_enabled ? 5 : 0);
|
||||
|
||||
if (last_sprite_coord_enable != r300->sprite_coord_enable ||
|
||||
last_two_sided_color != r300->two_sided_color) {
|
||||
|
|
|
@ -324,6 +324,7 @@ static void r300_update_rs_block(struct r300_context *r300)
|
|||
boolean any_bcolor_used = vs_outputs->bcolor[0] != ATTR_UNUSED ||
|
||||
vs_outputs->bcolor[1] != ATTR_UNUSED;
|
||||
int *stream_loc_notcl = r300->stream_loc_notcl;
|
||||
uint32_t stuffing_enable = 0;
|
||||
|
||||
if (r300->screen->caps.is_r500) {
|
||||
rX00_rs_col = r500_rs_col;
|
||||
|
@ -436,7 +437,11 @@ static void r300_update_rs_block(struct r300_context *r300)
|
|||
|
||||
/* Rasterize texture coordinates. */
|
||||
for (i = 0; i < ATTR_GENERIC_COUNT && tex_count < 8; i++) {
|
||||
bool sprite_coord = !!(r300->sprite_coord_enable & (1 << i));
|
||||
bool sprite_coord = false;
|
||||
|
||||
if (fs_inputs->generic[i] != ATTR_UNUSED) {
|
||||
sprite_coord = !!(r300->sprite_coord_enable & (1 << i));
|
||||
}
|
||||
|
||||
if (vs_outputs->generic[i] != ATTR_UNUSED || sprite_coord) {
|
||||
if (!sprite_coord) {
|
||||
|
@ -444,7 +449,9 @@ static void r300_update_rs_block(struct r300_context *r300)
|
|||
rs.vap_vsm_vtx_assm |= (R300_INPUT_CNTL_TC0 << tex_count);
|
||||
rs.vap_out_vtx_fmt[1] |= (4 << (3 * tex_count));
|
||||
stream_loc_notcl[loc++] = 6 + tex_count;
|
||||
}
|
||||
} else
|
||||
stuffing_enable |=
|
||||
R300_GB_TEX_ST << (R300_GB_TEX0_SOURCE_SHIFT + (tex_count*2));
|
||||
|
||||
/* Rasterize it. */
|
||||
rX00_rs_tex(&rs, tex_count, tex_ptr,
|
||||
|
@ -456,8 +463,8 @@ static void r300_update_rs_block(struct r300_context *r300)
|
|||
fp_offset++;
|
||||
|
||||
DBG(r300, DBG_RS,
|
||||
"r300: Rasterized generic %i written to FS%s.\n",
|
||||
i, sprite_coord ? " (sprite coord)" : "");
|
||||
"r300: Rasterized generic %i written to FS%s in texcoord %d.\n",
|
||||
i, sprite_coord ? " (sprite coord)" : "", tex_count);
|
||||
} else {
|
||||
DBG(r300, DBG_RS,
|
||||
"r300: Rasterized generic %i unused%s.\n",
|
||||
|
@ -560,10 +567,16 @@ static void r300_update_rs_block(struct r300_context *r300)
|
|||
count = MAX3(col_count, tex_count, 1);
|
||||
rs.inst_count = count - 1;
|
||||
|
||||
/* set the GB enable flags */
|
||||
if (r300->sprite_coord_enable)
|
||||
stuffing_enable |= R300_GB_POINT_STUFF_ENABLE;
|
||||
|
||||
rs.gb_enable = stuffing_enable;
|
||||
|
||||
/* Now, after all that, see if we actually need to update the state. */
|
||||
if (memcmp(r300->rs_block_state.state, &rs, sizeof(struct r300_rs_block))) {
|
||||
memcpy(r300->rs_block_state.state, &rs, sizeof(struct r300_rs_block));
|
||||
r300->rs_block_state.size = 11 + count*2;
|
||||
r300->rs_block_state.size = 13 + count*2;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue