r300: further cleanup
[mesa.git] / src / mesa / drivers / dri / r300 / r300_render.c
index 7af9691cdeeb444e6fad449e816a9843c1457e50..93fdc575885e2b32f0f5778a3db422187ad47b15 100644 (file)
@@ -66,16 +66,13 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
 #include "tnl/t_vp_build.h"
 #include "radeon_reg.h"
 #include "radeon_macros.h"
-#include "radeon_ioctl.h"
-#include "radeon_state.h"
 #include "r300_context.h"
 #include "r300_ioctl.h"
 #include "r300_state.h"
 #include "r300_reg.h"
 #include "r300_tex.h"
 #include "r300_emit.h"
-#include "r300_fragprog.h"
-extern int future_hw_tcl_on;
+#include "r300_fragprog_common.h"
 
 /**
  * \brief Convert a OpenGL primitive type into a R300 primitive type.
@@ -177,12 +174,12 @@ static void r300EmitElts(GLcontext * ctx, void *elts, unsigned long n_elts)
        r300ContextPtr rmesa = R300_CONTEXT(ctx);
        void *out;
 
-       radeonAllocDmaRegion(&rmesa->radeon, &rmesa->state.elt_dma_bo,
-                            &rmesa->state.elt_dma_offset, n_elts * 4, 4);
-       radeon_bo_map(rmesa->state.elt_dma_bo, 1);
-       out = rmesa->state.elt_dma_bo->ptr + rmesa->state.elt_dma_offset;
+       radeonAllocDmaRegion(&rmesa->radeon, &rmesa->radeon.tcl.elt_dma_bo,
+                            &rmesa->radeon.tcl.elt_dma_offset, n_elts * 4, 4);
+       radeon_bo_map(rmesa->radeon.tcl.elt_dma_bo, 1);
+       out = rmesa->radeon.tcl.elt_dma_bo->ptr + rmesa->radeon.tcl.elt_dma_offset;
        memcpy(out, elts, n_elts * 4);
-       radeon_bo_unmap(rmesa->state.elt_dma_bo);
+       radeon_bo_unmap(rmesa->radeon.tcl.elt_dma_bo);
 }
 
 static void r300FireEB(r300ContextPtr rmesa, int vertex_count, int type)
@@ -190,28 +187,30 @@ static void r300FireEB(r300ContextPtr rmesa, int vertex_count, int type)
        BATCH_LOCALS(&rmesa->radeon);
 
        if (vertex_count > 0) {
-               BEGIN_BATCH(8);
+               BEGIN_BATCH(10);
                OUT_BATCH_PACKET3(R300_PACKET3_3D_DRAW_INDX_2, 0);
                OUT_BATCH(R300_VAP_VF_CNTL__PRIM_WALK_INDICES |
                          ((vertex_count + 0) << 16) |
                          type |
                          R300_VAP_VF_CNTL__INDEX_SIZE_32bit);
-               
+
                if (!rmesa->radeon.radeonScreen->kernel_mm) {
                        OUT_BATCH_PACKET3(R300_PACKET3_INDX_BUFFER, 2);
-                       OUT_BATCH(R300_EB_UNK1 | (0 << 16) | R300_EB_UNK2);
-                       OUT_BATCH_RELOC(rmesa->state.elt_dma_offset,
-                                       rmesa->state.elt_dma_bo,
-                                       rmesa->state.elt_dma_offset,
+                       OUT_BATCH(R300_INDX_BUFFER_ONE_REG_WR | (0 << R300_INDX_BUFFER_SKIP_SHIFT) |
+                                (R300_VAP_PORT_IDX0 >> 2));
+                       OUT_BATCH_RELOC(rmesa->radeon.tcl.elt_dma_offset,
+                                       rmesa->radeon.tcl.elt_dma_bo,
+                                       rmesa->radeon.tcl.elt_dma_offset,
                                        RADEON_GEM_DOMAIN_GTT, 0, 0);
                        OUT_BATCH(vertex_count);
                } else {
                        OUT_BATCH_PACKET3(R300_PACKET3_INDX_BUFFER, 2);
-                       OUT_BATCH(R300_EB_UNK1 | (0 << 16) | R300_EB_UNK2);
-                       OUT_BATCH(rmesa->state.elt_dma_offset);
+                       OUT_BATCH(R300_INDX_BUFFER_ONE_REG_WR | (0 << R300_INDX_BUFFER_SKIP_SHIFT) |
+                                (R300_VAP_PORT_IDX0 >> 2));
+                       OUT_BATCH(rmesa->radeon.tcl.elt_dma_offset);
                        OUT_BATCH(vertex_count);
                        radeon_cs_write_reloc(rmesa->radeon.cmdbuf.cs,
-                                             rmesa->state.elt_dma_bo,
+                                             rmesa->radeon.tcl.elt_dma_bo,
                                              RADEON_GEM_DOMAIN_GTT, 0, 0);
                }
                END_BATCH();
@@ -224,46 +223,46 @@ static void r300EmitAOS(r300ContextPtr rmesa, GLuint nr, GLuint offset)
        uint32_t voffset;
        int sz = 1 + (nr >> 1) * 3 + (nr & 1) * 2;
        int i;
-       
+
        if (RADEON_DEBUG & DEBUG_VERTS)
                fprintf(stderr, "%s: nr=%d, ofs=0x%08x\n", __FUNCTION__, nr,
                        offset);
 
-    
+
        if (!rmesa->radeon.radeonScreen->kernel_mm) {
-               BEGIN_BATCH(sz+2);
+               BEGIN_BATCH(sz+2+(nr * 2));
                OUT_BATCH_PACKET3(R300_PACKET3_3D_LOAD_VBPNTR, sz - 1);
                OUT_BATCH(nr);
 
                for (i = 0; i + 1 < nr; i += 2) {
-                       OUT_BATCH((rmesa->state.aos[i].components << 0) |
-                                 (rmesa->state.aos[i].stride << 8) |
-                                 (rmesa->state.aos[i + 1].components << 16) |
-                                 (rmesa->state.aos[i + 1].stride << 24));
-                       
-                       voffset =  rmesa->state.aos[i + 0].offset +
-                               offset * 4 * rmesa->state.aos[i + 0].stride;
+                       OUT_BATCH((rmesa->radeon.tcl.aos[i].components << 0) |
+                                 (rmesa->radeon.tcl.aos[i].stride << 8) |
+                                 (rmesa->radeon.tcl.aos[i + 1].components << 16) |
+                                 (rmesa->radeon.tcl.aos[i + 1].stride << 24));
+
+                       voffset =  rmesa->radeon.tcl.aos[i + 0].offset +
+                               offset * 4 * rmesa->radeon.tcl.aos[i + 0].stride;
                        OUT_BATCH_RELOC(voffset,
-                                       rmesa->state.aos[i].bo,
+                                       rmesa->radeon.tcl.aos[i].bo,
                                        voffset,
                                        RADEON_GEM_DOMAIN_GTT,
                                        0, 0);
-                       voffset =  rmesa->state.aos[i + 1].offset +
-                         offset * 4 * rmesa->state.aos[i + 1].stride;
+                       voffset =  rmesa->radeon.tcl.aos[i + 1].offset +
+                         offset * 4 * rmesa->radeon.tcl.aos[i + 1].stride;
                        OUT_BATCH_RELOC(voffset,
-                                       rmesa->state.aos[i+1].bo,
+                                       rmesa->radeon.tcl.aos[i+1].bo,
                                        voffset,
                                        RADEON_GEM_DOMAIN_GTT,
                                        0, 0);
                }
-               
+
                if (nr & 1) {
-                       OUT_BATCH((rmesa->state.aos[nr - 1].components << 0) |
-                                 (rmesa->state.aos[nr - 1].stride << 8));
-                       voffset =  rmesa->state.aos[nr - 1].offset +
-                               offset * 4 * rmesa->state.aos[nr - 1].stride;
+                       OUT_BATCH((rmesa->radeon.tcl.aos[nr - 1].components << 0) |
+                                 (rmesa->radeon.tcl.aos[nr - 1].stride << 8));
+                       voffset =  rmesa->radeon.tcl.aos[nr - 1].offset +
+                               offset * 4 * rmesa->radeon.tcl.aos[nr - 1].stride;
                        OUT_BATCH_RELOC(voffset,
-                                       rmesa->state.aos[nr - 1].bo,
+                                       rmesa->radeon.tcl.aos[nr - 1].bo,
                                        voffset,
                                        RADEON_GEM_DOMAIN_GTT,
                                        0, 0);
@@ -276,45 +275,45 @@ static void r300EmitAOS(r300ContextPtr rmesa, GLuint nr, GLuint offset)
                OUT_BATCH(nr);
 
                for (i = 0; i + 1 < nr; i += 2) {
-                       OUT_BATCH((rmesa->state.aos[i].components << 0) |
-                                 (rmesa->state.aos[i].stride << 8) |
-                                 (rmesa->state.aos[i + 1].components << 16) |
-                                 (rmesa->state.aos[i + 1].stride << 24));
-                       
-                       voffset =  rmesa->state.aos[i + 0].offset +
-                               offset * 4 * rmesa->state.aos[i + 0].stride;
+                       OUT_BATCH((rmesa->radeon.tcl.aos[i].components << 0) |
+                                 (rmesa->radeon.tcl.aos[i].stride << 8) |
+                                 (rmesa->radeon.tcl.aos[i + 1].components << 16) |
+                                 (rmesa->radeon.tcl.aos[i + 1].stride << 24));
+
+                       voffset =  rmesa->radeon.tcl.aos[i + 0].offset +
+                               offset * 4 * rmesa->radeon.tcl.aos[i + 0].stride;
                        OUT_BATCH(voffset);
-                       voffset =  rmesa->state.aos[i + 1].offset +
-                               offset * 4 * rmesa->state.aos[i + 1].stride;
+                       voffset =  rmesa->radeon.tcl.aos[i + 1].offset +
+                               offset * 4 * rmesa->radeon.tcl.aos[i + 1].stride;
                        OUT_BATCH(voffset);
                }
-               
+
                if (nr & 1) {
-                       OUT_BATCH((rmesa->state.aos[nr - 1].components << 0) |
-                         (rmesa->state.aos[nr - 1].stride << 8));
-                       voffset =  rmesa->state.aos[nr - 1].offset +
-                               offset * 4 * rmesa->state.aos[nr - 1].stride;
+                       OUT_BATCH((rmesa->radeon.tcl.aos[nr - 1].components << 0) |
+                         (rmesa->radeon.tcl.aos[nr - 1].stride << 8));
+                       voffset =  rmesa->radeon.tcl.aos[nr - 1].offset +
+                               offset * 4 * rmesa->radeon.tcl.aos[nr - 1].stride;
                        OUT_BATCH(voffset);
                }
                for (i = 0; i + 1 < nr; i += 2) {
-                       voffset =  rmesa->state.aos[i + 0].offset +
-                               offset * 4 * rmesa->state.aos[i + 0].stride;
+                       voffset =  rmesa->radeon.tcl.aos[i + 0].offset +
+                               offset * 4 * rmesa->radeon.tcl.aos[i + 0].stride;
                        radeon_cs_write_reloc(rmesa->radeon.cmdbuf.cs,
-                                             rmesa->state.aos[i+0].bo,
+                                             rmesa->radeon.tcl.aos[i+0].bo,
                                              RADEON_GEM_DOMAIN_GTT,
                                              0, 0);
-                       voffset =  rmesa->state.aos[i + 1].offset +
-                               offset * 4 * rmesa->state.aos[i + 1].stride;
+                       voffset =  rmesa->radeon.tcl.aos[i + 1].offset +
+                               offset * 4 * rmesa->radeon.tcl.aos[i + 1].stride;
                        radeon_cs_write_reloc(rmesa->radeon.cmdbuf.cs,
-                                             rmesa->state.aos[i+1].bo,
+                                             rmesa->radeon.tcl.aos[i+1].bo,
                                              RADEON_GEM_DOMAIN_GTT,
                                              0, 0);
                }
                if (nr & 1) {
-                       voffset =  rmesa->state.aos[nr - 1].offset +
-                               offset * 4 * rmesa->state.aos[nr - 1].stride;
+                       voffset =  rmesa->radeon.tcl.aos[nr - 1].offset +
+                               offset * 4 * rmesa->radeon.tcl.aos[nr - 1].stride;
                        radeon_cs_write_reloc(rmesa->radeon.cmdbuf.cs,
-                                             rmesa->state.aos[nr-1].bo,
+                                             rmesa->radeon.tcl.aos[nr-1].bo,
                                              RADEON_GEM_DOMAIN_GTT,
                                              0, 0);
                }
@@ -336,7 +335,6 @@ static void r300FireAOS(r300ContextPtr rmesa, int vertex_count, int type)
 static void r300RunRenderPrimitive(r300ContextPtr rmesa, GLcontext * ctx,
                                   int start, int end, int prim)
 {
-       BATCH_LOCALS(&rmesa->radeon);
        int type, num_verts;
        TNLcontext *tnl = TNL_CONTEXT(ctx);
        struct vertex_buffer *vb = &tnl->vb;
@@ -371,10 +369,10 @@ static void r300RunRenderPrimitive(r300ContextPtr rmesa, GLcontext * ctx,
                 * arrays. *sigh*
                 */
                r300EmitElts(ctx, vb->Elts, num_verts);
-               r300EmitAOS(rmesa, rmesa->state.aos_count, start);
+               r300EmitAOS(rmesa, rmesa->radeon.tcl.aos_count, start);
                r300FireEB(rmesa, num_verts, type);
        } else {
-               r300EmitAOS(rmesa, rmesa->state.aos_count, start);
+               r300EmitAOS(rmesa, rmesa->radeon.tcl.aos_count, start);
                r300FireAOS(rmesa, num_verts, type);
        }
        COMMIT_BATCH();
@@ -398,7 +396,7 @@ static GLboolean r300RunRender(GLcontext * ctx,
        r300UpdateShaderStates(rmesa);
 
        r300EmitCacheFlush(rmesa);
-       r300EmitState(rmesa);
+       radeonEmitState(&rmesa->radeon);
 
        for (i = 0; i < vb->PrimitiveCount; i++) {
                GLuint prim = _tnl_translate_prim(&vb->Primitive[i]);
@@ -409,7 +407,7 @@ static GLboolean r300RunRender(GLcontext * ctx,
 
        r300EmitCacheFlush(rmesa);
 
-       r300ReleaseArrays(ctx);
+       radeonReleaseArrays(ctx, ~0);
 
        return GL_FALSE;
 }
@@ -427,36 +425,21 @@ static GLboolean r300RunRender(GLcontext * ctx,
 static int r300Fallback(GLcontext * ctx)
 {
        r300ContextPtr r300 = R300_CONTEXT(ctx);
-       /* Do we need to use new-style shaders?
-        * Also is there a better way to do this? */
-       if (r300->radeon.radeonScreen->chip_family >= CHIP_FAMILY_RV515) {
-               struct r500_fragment_program *fp = (struct r500_fragment_program *)
-           (char *)ctx->FragmentProgram._Current;
-               if (fp) {
-                       if (!fp->translated) {
-                               r500TranslateFragmentShader(r300, fp);
-                               FALLBACK_IF(!fp->translated);
-                       }
-               }
-       } else {
-               struct r300_fragment_program *fp = (struct r300_fragment_program *)
-           (char *)ctx->FragmentProgram._Current;
-               if (fp) {
-                       if (!fp->translated) {
-                               r300TranslateFragmentShader(r300, fp);
-                               FALLBACK_IF(!fp->translated);
-                       }
-               }
+       const unsigned back = ctx->Stencil._BackFace;
+
+       FALLBACK_IF(r300->radeon.Fallback);
+
+       struct r300_fragment_program *fp = (struct r300_fragment_program *) ctx->FragmentProgram._Current;
+       if (fp && !fp->translated) {
+               r300TranslateFragmentShader(ctx, ctx->FragmentProgram._Current);
+               FALLBACK_IF(fp->error);
        }
 
        FALLBACK_IF(ctx->RenderMode != GL_RENDER);
 
-       FALLBACK_IF(ctx->Stencil._TestTwoSide
-                   && (ctx->Stencil.Ref[0] != ctx->Stencil.Ref[1]
-                       || ctx->Stencil.ValueMask[0] !=
-                       ctx->Stencil.ValueMask[1]
-                       || ctx->Stencil.WriteMask[0] !=
-                       ctx->Stencil.WriteMask[1]));
+       FALLBACK_IF(ctx->Stencil.Enabled && (ctx->Stencil.Ref[0] != ctx->Stencil.Ref[back]
+                   || ctx->Stencil.ValueMask[0] != ctx->Stencil.ValueMask[back]
+                   || ctx->Stencil.WriteMask[0] != ctx->Stencil.WriteMask[back]));
 
        if (ctx->Extensions.NV_point_sprite || ctx->Extensions.ARB_point_sprite)
                FALLBACK_IF(ctx->Point.PointSprite);
@@ -483,8 +466,11 @@ static GLboolean r300RunNonTCLRender(GLcontext * ctx,
        if (r300Fallback(ctx) >= R300_FALLBACK_RAST)
                return GL_TRUE;
 
-       if (!(rmesa->radeon.radeonScreen->chip_flags & RADEON_CHIPSET_TCL))
-               return GL_TRUE;
+       if (rmesa->options.hw_tcl_enabled == GL_FALSE)
+               return GL_TRUE;
+
+       if (!r300ValidateBuffers(ctx))
+           return GL_TRUE;
 
        return r300RunRender(ctx, stage);
 }
@@ -495,27 +481,25 @@ static GLboolean r300RunTCLRender(GLcontext * ctx,
        r300ContextPtr rmesa = R300_CONTEXT(ctx);
        struct r300_vertex_program *vp;
 
-       hw_tcl_on = future_hw_tcl_on;
-
        if (RADEON_DEBUG & DEBUG_PRIMS)
                fprintf(stderr, "%s\n", __FUNCTION__);
 
-       if (hw_tcl_on == GL_FALSE)
+       if (rmesa->options.hw_tcl_enabled == GL_FALSE)
                return GL_TRUE;
 
        if (r300Fallback(ctx) >= R300_FALLBACK_TCL) {
-               hw_tcl_on = GL_FALSE;
+               rmesa->options.hw_tcl_enabled = GL_FALSE;
                return GL_TRUE;
        }
 
        if (!r300ValidateBuffers(ctx))
            return GL_TRUE;
-       
+
        r300UpdateShaders(rmesa);
 
        vp = (struct r300_vertex_program *)CURRENT_VERTEX_SHADER(ctx);
        if (vp->native == GL_FALSE) {
-               hw_tcl_on = GL_FALSE;
+               rmesa->options.hw_tcl_enabled = GL_FALSE;
                return GL_TRUE;
        }