r300: rewrite vertex setup for software T&L path using functions from software TCL...
authorMaciej Cencora <m.cencora@gmail.com>
Sat, 30 May 2009 11:50:50 +0000 (13:50 +0200)
committerDave Airlie <airlied@redhat.com>
Sun, 7 Jun 2009 06:39:47 +0000 (16:39 +1000)
src/mesa/drivers/dri/r300/r300_emit.c
src/mesa/drivers/dri/r300/r300_emit.h
src/mesa/drivers/dri/r300/r300_render.c
src/mesa/drivers/dri/r300/r300_render.h

index d6c29ea3887a168be33886e004df02e798ff0d0f..cf31596d9b8c5918718df7c1d7a52c1c675d7fd3 100644 (file)
@@ -31,6 +31,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  * \file
  *
  * \author Keith Whitwell <keith@tungstengraphics.com>
+ * \author Maciej Cencora <m.cencora@gmail.com>
  */
 
 #include "main/glheader.h"
@@ -49,74 +50,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #include "r300_state.h"
 #include "r300_emit.h"
 #include "r300_ioctl.h"
-
-
-#if SWIZZLE_X != R300_INPUT_ROUTE_SELECT_X || \
-    SWIZZLE_Y != R300_INPUT_ROUTE_SELECT_Y || \
-    SWIZZLE_Z != R300_INPUT_ROUTE_SELECT_Z || \
-    SWIZZLE_W != R300_INPUT_ROUTE_SELECT_W || \
-    SWIZZLE_ZERO != R300_INPUT_ROUTE_SELECT_ZERO || \
-    SWIZZLE_ONE != R300_INPUT_ROUTE_SELECT_ONE
-#error Cannot change these!
-#endif
-
-#define DEBUG_ALL DEBUG_VERTS
-
-#define DW_SIZE(x) ((inputs[tab[(x)]] << R300_DST_VEC_LOC_SHIFT) |     \
-                   (attribptr[tab[(x)]]->size - 1) << R300_DATA_TYPE_0_SHIFT)
-
-GLuint r300VAPInputRoute0(uint32_t * dst, GLvector4f ** attribptr,
-                                int *inputs, GLint * tab, GLuint nr)
-{
-       GLuint i, dw;
-
-       /* type, inputs, stop bit, size */
-       for (i = 0; i < nr; i += 2) {
-               /* make sure input is valid, would lockup the gpu */
-               assert(inputs[tab[i]] != -1);
-               dw = (R300_SIGNED | DW_SIZE(i));
-               if (i + 1 == nr) {
-                       dw |= R300_LAST_VEC << R300_DATA_TYPE_0_SHIFT;
-               } else {
-                       assert(inputs[tab[i + 1]] != -1);
-                       dw |= (R300_SIGNED |
-                              DW_SIZE(i + 1)) << R300_DATA_TYPE_1_SHIFT;
-                       if (i + 2 == nr) {
-                               dw |= R300_LAST_VEC << R300_DATA_TYPE_1_SHIFT;
-                       }
-               }
-               dst[i >> 1] = dw;
-       }
-
-       return (nr + 1) >> 1;
-}
-
-static GLuint r300VAPInputRoute1Swizzle(int swizzle[4])
-{
-       return (swizzle[0] << R300_SWIZZLE_SELECT_X_SHIFT) |
-           (swizzle[1] << R300_SWIZZLE_SELECT_Y_SHIFT) |
-           (swizzle[2] << R300_SWIZZLE_SELECT_Z_SHIFT) |
-           (swizzle[3] << R300_SWIZZLE_SELECT_W_SHIFT);
-}
-
-GLuint r300VAPInputRoute1(uint32_t * dst, int swizzle[][4], GLuint nr)
-{
-       GLuint i, dw;
-
-       for (i = 0; i < nr; i += 2) {
-               dw = (r300VAPInputRoute1Swizzle(swizzle[i]) |
-                     ((R300_WRITE_ENA_X | R300_WRITE_ENA_Y |
-                       R300_WRITE_ENA_Z | R300_WRITE_ENA_W) << R300_WRITE_ENA_SHIFT)) << R300_SWIZZLE0_SHIFT;
-               if (i + 1 < nr) {
-                       dw |= (r300VAPInputRoute1Swizzle(swizzle[i + 1]) |
-                              ((R300_WRITE_ENA_X | R300_WRITE_ENA_Y |
-                                R300_WRITE_ENA_Z | R300_WRITE_ENA_W) << R300_WRITE_ENA_SHIFT)) << R300_SWIZZLE1_SHIFT;
-               }
-               dst[i >> 1] = dw;
-       }
-
-       return (nr + 1) >> 1;
-}
+#include "r300_render.h"
+#include "r300_swtcl.h"
 
 GLuint r300VAPInputCntl0(GLcontext * ctx, GLuint InputsRead)
 {
@@ -194,154 +129,39 @@ GLuint r300VAPOutputCntl1(GLcontext * ctx, GLuint OutputsWritten)
        return ret;
 }
 
-/* Emit vertex data to GART memory
- * Route inputs to the vertex processor
- */
-void r300EmitArrays(GLcontext * ctx)
+GLboolean r300EmitArrays(GLcontext * ctx)
 {
-       r300ContextPtr rmesa = R300_CONTEXT(ctx);
-       TNLcontext *tnl = TNL_CONTEXT(ctx);
-       struct vertex_buffer *vb = &tnl->vb;
-       GLuint nr;
-       GLuint count = vb->Count;
-       GLuint i;
-       GLuint InputsRead = 0, OutputsWritten = 0;
-       int *inputs = NULL;
-       int vir_inputs[VERT_ATTRIB_MAX];
-       GLint tab[VERT_ATTRIB_MAX];
-       int swizzle[VERT_ATTRIB_MAX][4];
-       struct r300_vertex_program *prog = rmesa->selected_vp;
-
-       if (rmesa->options.hw_tcl_enabled) {
-               inputs = prog->inputs;
-               InputsRead = prog->key.InputsRead;
-               OutputsWritten = prog->key.OutputsWritten;
-       } else {
-               inputs = rmesa->swtcl.sw_tcl_inputs;
-
-               DECLARE_RENDERINPUTS(render_inputs_bitset);
-               RENDERINPUTS_COPY(render_inputs_bitset, tnl->render_inputs_bitset);
-
-               vb->AttribPtr[VERT_ATTRIB_POS] = vb->ClipPtr;
-
-               assert(RENDERINPUTS_TEST(render_inputs_bitset, _TNL_ATTRIB_POS));
-               assert(RENDERINPUTS_TEST(render_inputs_bitset, _TNL_ATTRIB_NORMAL) == 0);
-
-               if (RENDERINPUTS_TEST(render_inputs_bitset, _TNL_ATTRIB_POS)) {
-                       InputsRead |= 1 << VERT_ATTRIB_POS;
-                       OutputsWritten |= 1 << VERT_RESULT_HPOS;
-               }
+       r300ContextPtr r300 = R300_CONTEXT(ctx);
+       struct r300_vertex_buffer *vbuf = &r300->vbuf;
+       GLuint InputsRead, OutputsWritten;
 
-               if (RENDERINPUTS_TEST(render_inputs_bitset, _TNL_ATTRIB_COLOR0)) {
-                       InputsRead |= 1 << VERT_ATTRIB_COLOR0;
-                       OutputsWritten |= 1 << VERT_RESULT_COL0;
-               }
-
-               if (RENDERINPUTS_TEST(render_inputs_bitset, _TNL_ATTRIB_COLOR1)) {
-                       InputsRead |= 1 << VERT_ATTRIB_COLOR1;
-                       OutputsWritten |= 1 << VERT_RESULT_COL1;
-               }
-
-               for (i = 0; i < ctx->Const.MaxTextureUnits; i++) {
-                       if (RENDERINPUTS_TEST(render_inputs_bitset, _TNL_ATTRIB_TEX(i))) {
-                               InputsRead |= 1 << (VERT_ATTRIB_TEX0 + i);
-                               OutputsWritten |= 1 << (VERT_RESULT_TEX0 + i);
-                       }
-               }
-
-               for (i = 0, nr = 0; i < VERT_ATTRIB_MAX; i++) {
-                       if (InputsRead & (1 << i)) {
-                               inputs[i] = nr++;
-                       } else {
-                               inputs[i] = -1;
-                       }
-               }
+       r300ChooseSwtclVertexFormat(ctx, &InputsRead, &OutputsWritten);
 
-               /* Fixed, apply to vir0 only */
-               memcpy(vir_inputs, inputs, VERT_ATTRIB_MAX * sizeof(int));
-               inputs = vir_inputs;
-               if (InputsRead & VERT_ATTRIB_POS)
-                       inputs[VERT_ATTRIB_POS] = 0;
-               if (InputsRead & (1 << VERT_ATTRIB_COLOR0))
-                       inputs[VERT_ATTRIB_COLOR0] = 2;
-               if (InputsRead & (1 << VERT_ATTRIB_COLOR1))
-                       inputs[VERT_ATTRIB_COLOR1] = 3;
-               for (i = VERT_ATTRIB_TEX0; i <= VERT_ATTRIB_TEX7; i++)
-                       if (InputsRead & (1 << i))
-                               inputs[i] = 6 + (i - VERT_ATTRIB_TEX0);
-
-               RENDERINPUTS_COPY(rmesa->render_inputs_bitset, render_inputs_bitset);
-       }
+       r300SwitchFallback(ctx, R300_FALLBACK_AOS_LIMIT, vbuf->num_attribs > R300_MAX_AOS_ARRAYS);
+       if (r300->fallback & R300_RASTER_FALLBACK_MASK)
+               return GL_FALSE;
 
-       assert(InputsRead);
-       assert(OutputsWritten);
+       {
+               struct vertex_buffer *mesa_vb = &TNL_CONTEXT(ctx)->vb;
+               GLuint attr, i;
 
-       for (i = 0, nr = 0; i < VERT_ATTRIB_MAX; i++) {
-               if (InputsRead & (1 << i)) {
-                       tab[nr++] = i;
+               for (i = 0; i < vbuf->num_attribs; i++) {
+                       attr = vbuf->attribs[i].element;
+                       rcommon_emit_vector(ctx, &r300->radeon.tcl.aos[i], mesa_vb->AttribPtr[attr]->data,
+                                       mesa_vb->AttribPtr[attr]->size, mesa_vb->AttribPtr[attr]->stride, mesa_vb->Count);
                }
-       }
-
-       assert(nr <= R300_MAX_AOS_ARRAYS);
 
-       for (i = 0; i < nr; i++) {
-               int ci;
+               r300->radeon.tcl.aos_count = vbuf->num_attribs;
 
-               swizzle[i][0] = SWIZZLE_ZERO;
-               swizzle[i][1] = SWIZZLE_ZERO;
-               swizzle[i][2] = SWIZZLE_ZERO;
-               swizzle[i][3] = SWIZZLE_ONE;
-
-               for (ci = 0; ci < vb->AttribPtr[tab[i]]->size; ci++) {
-                       swizzle[i][ci] = ci;
-               }
-               rcommon_emit_vector(ctx, &rmesa->radeon.tcl.aos[i],
-                                   vb->AttribPtr[tab[i]]->data,
-                                   vb->AttribPtr[tab[i]]->size,
-                                   vb->AttribPtr[tab[i]]->stride, count);
+               /* Fill index buffer info */
+               r300->ind_buf.ptr = mesa_vb->Elts;
+               r300->ind_buf.is_32bit = GL_TRUE;
+               r300->ind_buf.free_needed = GL_FALSE;
        }
 
-       /* Setup INPUT_ROUTE. */
-       if (rmesa->radeon.radeonScreen->kernel_mm) {
-               R300_STATECHANGE(rmesa, vir[0]);
-               rmesa->hw.vir[0].cmd[0] &= 0xC000FFFF;
-               rmesa->hw.vir[1].cmd[0] &= 0xC000FFFF;
-               rmesa->hw.vir[0].cmd[0] |=
-                       (r300VAPInputRoute0(&rmesa->hw.vir[0].cmd[R300_VIR_CNTL_0],
-                                           vb->AttribPtr, inputs, tab, nr) & 0x3FFF) << 16;
-               R300_STATECHANGE(rmesa, vir[1]);
-               rmesa->hw.vir[1].cmd[0] |=
-                       (r300VAPInputRoute1(&rmesa->hw.vir[1].cmd[R300_VIR_CNTL_0], swizzle,
-                                           nr) & 0x3FFF) << 16;
-       } else {
-               R300_STATECHANGE(rmesa, vir[0]);
-               ((drm_r300_cmd_header_t *) rmesa->hw.vir[0].cmd)->packet0.count =
-                       r300VAPInputRoute0(&rmesa->hw.vir[0].cmd[R300_VIR_CNTL_0],
-                                          vb->AttribPtr, inputs, tab, nr);
-               R300_STATECHANGE(rmesa, vir[1]);
-               ((drm_r300_cmd_header_t *) rmesa->hw.vir[1].cmd)->packet0.count =
-                       r300VAPInputRoute1(&rmesa->hw.vir[1].cmd[R300_VIR_CNTL_0], swizzle,
-                                          nr);
-       }
-
-       /* Setup INPUT_CNTL. */
-       R300_STATECHANGE(rmesa, vic);
-       rmesa->hw.vic.cmd[R300_VIC_CNTL_0] = r300VAPInputCntl0(ctx, InputsRead);
-       rmesa->hw.vic.cmd[R300_VIC_CNTL_1] = r300VAPInputCntl1(ctx, InputsRead);
-
-       /* Setup OUTPUT_VTX_FMT. */
-       R300_STATECHANGE(rmesa, vof);
-       rmesa->hw.vof.cmd[R300_VOF_CNTL_0] =
-           r300VAPOutputCntl0(ctx, OutputsWritten);
-       rmesa->hw.vof.cmd[R300_VOF_CNTL_1] =
-           r300VAPOutputCntl1(ctx, OutputsWritten);
-
-       rmesa->radeon.tcl.aos_count = nr;
+       r300SetupVAP(ctx, InputsRead, OutputsWritten);
 
-       /* Fill index buffer info */
-       rmesa->ind_buf.ptr = vb->Elts;
-       rmesa->ind_buf.is_32bit = GL_TRUE;
-       rmesa->ind_buf.free_needed = GL_FALSE;
+       return GL_TRUE;
 }
 
 void r300EmitCacheFlush(r300ContextPtr rmesa)
index e6485e9bd75bbd80704e4aed9b641e86f7b860e1..d88914ce9595fd2d3264c2e52eebb451e97ee2fa 100644 (file)
@@ -216,16 +216,13 @@ void static INLINE cp_wait(radeonContextPtr radeon, unsigned char flags)
        }
 }
 
-extern void r300EmitArrays(GLcontext * ctx);
+extern GLboolean r300EmitArrays(GLcontext * ctx);
 
 extern int r300PrimitiveType(r300ContextPtr rmesa, int prim);
 extern int r300NumVerts(r300ContextPtr rmesa, int num_verts, int prim);
 
 extern void r300EmitCacheFlush(r300ContextPtr rmesa);
 
-extern GLuint r300VAPInputRoute0(uint32_t * dst, GLvector4f ** attribptr,
-                                int *inputs, GLint * tab, GLuint nr);
-extern GLuint r300VAPInputRoute1(uint32_t * dst, int swizzle[][4], GLuint nr);
 extern GLuint r300VAPInputCntl0(GLcontext * ctx, GLuint InputsRead);
 extern GLuint r300VAPInputCntl1(GLcontext * ctx, GLuint InputsRead);
 extern GLuint r300VAPOutputCntl0(GLcontext * ctx, GLuint OutputsWritten);
index 4982bc63b9497b8da22a94c5cfe51920bc2dda16..adda92467a6b0ffbc382d90d66efbbcebf5f03bc 100644 (file)
@@ -466,6 +466,16 @@ void r300SwitchFallback(GLcontext *ctx, uint32_t bit, GLboolean mode)
                        fallback_warn |= bit;
                }
                rmesa->fallback |= bit;
+
+               /* update only if we change from no tcl fallbacks to some tcl fallbacks */
+               if (rmesa->options.hw_tcl_enabled) {
+                       if (((old_fallback & R300_TCL_FALLBACK_MASK) == 0) &&
+                               ((bit & R300_TCL_FALLBACK_MASK) > 0)) {
+                               R300_STATECHANGE(rmesa, vap_cntl_status);
+                               rmesa->hw.vap_cntl_status.cmd[1] |= R300_VAP_TCL_BYPASS;
+                       }
+               }
+
                /* update only if we change from no raster fallbacks to some raster fallbacks */
                if (((old_fallback & R300_RASTER_FALLBACK_MASK) == 0) &&
                        ((bit & R300_RASTER_FALLBACK_MASK) > 0)) {
@@ -476,6 +486,15 @@ void r300SwitchFallback(GLcontext *ctx, uint32_t bit, GLboolean mode)
                }
        } else {
                rmesa->fallback &= ~bit;
+
+               /* update only if we have disabled all tcl fallbacks */
+               if (rmesa->options.hw_tcl_enabled) {
+                       if ((old_fallback & R300_RASTER_FALLBACK_MASK) == bit) {
+                               R300_STATECHANGE(rmesa, vap_cntl_status);
+                               rmesa->hw.vap_cntl_status.cmd[1] &= ~R300_VAP_TCL_BYPASS;
+                       }
+               }
+
                /* update only if we have disabled all raster fallbacks */
                if ((old_fallback & R300_RASTER_FALLBACK_MASK) == bit) {
                        _swrast_flush( ctx );
index 192d738f5ffeb1144c12d01d5c5c0ec669324db2..ec785474a677603d0b96b1bea6b82b17d02be6b2 100644 (file)
 #define MASK_Z R300_WRITE_ENA_Z
 #define MASK_W R300_WRITE_ENA_W
 
+#if SWIZZLE_X != R300_INPUT_ROUTE_SELECT_X || \
+    SWIZZLE_Y != R300_INPUT_ROUTE_SELECT_Y || \
+    SWIZZLE_Z != R300_INPUT_ROUTE_SELECT_Z || \
+    SWIZZLE_W != R300_INPUT_ROUTE_SELECT_W || \
+    SWIZZLE_ZERO != R300_INPUT_ROUTE_SELECT_ZERO || \
+    SWIZZLE_ONE != R300_INPUT_ROUTE_SELECT_ONE
+#error Cannot change these!
+#endif
+
 extern const struct tnl_pipeline_stage _r300_render_stage;
 
 extern void r300SwitchFallback(GLcontext *ctx, uint32_t bit, GLboolean mode);