r300g/swtcl: fix point sprite texgen (do it in HW)
authorMarek Olšák <maraeo@gmail.com>
Sat, 15 May 2010 22:21:53 +0000 (00:21 +0200)
committerMarek Olšák <maraeo@gmail.com>
Sat, 15 May 2010 22:21:53 +0000 (00:21 +0200)
src/gallium/drivers/r300/r300_context.h
src/gallium/drivers/r300/r300_state.c

index 69c09560e7ef630054ab26cd4e5a8af2956d3164..e44906d00997c85d777ec28637496e29c1cf61a9 100644 (file)
@@ -90,8 +90,10 @@ struct r300_dsa_state {
 };
 
 struct r300_rs_state {
-    /* Draw-specific rasterizer state */
+    /* Original rasterizer state. */
     struct pipe_rasterizer_state rs;
+    /* Draw-specific rasterizer state. */
+    struct pipe_rasterizer_state rs_draw;
 
     uint32_t vap_control_status;    /* R300_VAP_CNTL_STATUS: 0x2140 */
     uint32_t antialiasing_config;   /* R300_GB_AA_CONFIG: 0x4020 */
index 73713eab9893736af87e52e2d1da14de54ac9988..ac4e87abe09419888977f2cb0830fbdcea32092a 100644 (file)
@@ -756,8 +756,12 @@ static void* r300_create_rs_state(struct pipe_context* pipe,
     int i;
     float psiz;
 
-    /* Copy rasterizer state for Draw. */
+    /* Copy rasterizer state. */
     rs->rs = *state;
+    rs->rs_draw = *state;
+
+    /* Override some states for Draw. */
+    rs->rs_draw.sprite_coord_enable = 0; /* We can do this in HW. */
 
 #ifdef PIPE_ARCH_LITTLE_ENDIAN
     rs->vap_control_status = R300_VC_NO_SWAP;
@@ -904,9 +908,9 @@ static void r300_bind_rs_state(struct pipe_context* pipe, void* state)
     int last_sprite_coord_enable = r300->sprite_coord_enable;
     boolean last_two_sided_color = r300->two_sided_color;
 
-    if (r300->draw) {
+    if (r300->draw && rs) {
         draw_flush(r300->draw);
-        draw_set_rasterizer_state(r300->draw, &rs->rs, state);
+        draw_set_rasterizer_state(r300->draw, &rs->rs_draw, state);
     }
 
     if (rs) {