r300: further cleanup
authorMaciej Cencora <m.cencora@gmail.com>
Wed, 13 May 2009 20:24:57 +0000 (22:24 +0200)
committerAlex Deucher <alexdeucher@gmail.com>
Sat, 16 May 2009 15:42:02 +0000 (11:42 -0400)
- move extensions init into seperate function
- move options handling into seperate function
- create new structure to hold options values
- use context->options.hw_tcl_enabled field instead of global hw_tcl_on and future_hw_tcl_on variables

src/mesa/drivers/dri/r300/r300_cmdbuf.c
src/mesa/drivers/dri/r300/r300_context.c
src/mesa/drivers/dri/r300/r300_context.h
src/mesa/drivers/dri/r300/r300_emit.c
src/mesa/drivers/dri/r300/r300_ioctl.c
src/mesa/drivers/dri/r300/r300_render.c
src/mesa/drivers/dri/r300/r300_state.c

index a0d99ddfb672dbb47cfcc1b3428c10413ced28ed..253378767b7442b6a32e20cd79a3fa4a5a20e4f7 100644 (file)
@@ -420,12 +420,11 @@ int check_r500fp_const(GLcontext *ctx, struct radeon_state_atom *atom)
 void r300InitCmdBuf(r300ContextPtr r300)
 {
        int mtu;
-       int has_tcl = 1;
+       int has_tcl;
        int is_r500 = 0;
        int i;
 
-       if (!(r300->radeon.radeonScreen->chip_flags & RADEON_CHIPSET_TCL))
-               has_tcl = 0;
+       has_tcl = r300->options.hw_tcl_enabled;
 
        if (r300->radeon.radeonScreen->chip_family >= CHIP_FAMILY_RV515)
                is_r500 = 1;
index 70c7730be9f784b7cb095d4c63bff89c113f392e..3c16e80d2bb68057f025e207bef001109da6f132 100644 (file)
@@ -72,10 +72,6 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #include "utils.h"
 #include "xmlpool.h"           /* for symbolic values of enum-type options */
 
-/* hw_tcl_on derives from future_hw_tcl_on when its safe to change it. */
-int future_hw_tcl_on = 1;
-int hw_tcl_on = 1;
-
 #define need_GL_VERSION_2_0
 #define need_GL_ARB_point_parameters
 #define need_GL_ARB_vertex_program
@@ -296,7 +292,7 @@ static void r300InitConstValues(GLcontext *ctx, radeonScreenPtr screen)
        ctx->Const.MaxDrawBuffers = 1;
 
        /* currently bogus data */
-       if (screen->chip_flags & RADEON_CHIPSET_TCL) {
+       if (r300->options.hw_tcl_enabled) {
                ctx->Const.VertexProgram.MaxInstructions = VSF_MAX_FRAGMENT_LENGTH / 4;
                ctx->Const.VertexProgram.MaxNativeInstructions =
                  VSF_MAX_FRAGMENT_LENGTH / 4;
@@ -329,6 +325,47 @@ static void r300InitConstValues(GLcontext *ctx, radeonScreenPtr screen)
        }
 }
 
+static void r300ParseOptions(r300ContextPtr r300, radeonScreenPtr screen)
+{
+       struct r300_options options = { 0 };
+
+       driParseConfigFiles(&r300->radeon.optionCache, &screen->optionCache,
+                           screen->driScreen->myNum, "r300");
+
+       r300->disable_lowimpact_fallback = driQueryOptionb(&r300->radeon.optionCache, "disable_lowimpact_fallback");
+       r300->radeon.initialMaxAnisotropy = driQueryOptionf(&r300->radeon.optionCache, "def_max_anisotropy");
+
+       options.stencil_two_side_disabled = driQueryOptionb(&r300->radeon.optionCache, "disable_stencil_two_side");
+       options.s3tc_force_enabled = driQueryOptionb(&r300->radeon.optionCache, "force_s3tc_enable");
+       options.s3tc_force_disabled = driQueryOptionb(&r300->radeon.optionCache, "disable_s3tc");
+
+       if (!(screen->chip_flags & RADEON_CHIPSET_TCL) || driQueryOptioni(&r300->radeon.optionCache, "tcl_mode") == DRI_CONF_TCL_SW)
+               options.hw_tcl_enabled = 0;
+       else
+               options.hw_tcl_enabled = 1;
+
+       r300->options = options;
+}
+
+static void r300InitGLExtensions(GLcontext *ctx)
+{
+       r300ContextPtr r300 = R300_CONTEXT(ctx);
+
+       driInitExtensions(ctx, card_extensions, GL_TRUE);
+       if (r300->radeon.radeonScreen->kernel_mm)
+               driInitExtensions(ctx, mm_extensions, GL_FALSE);
+
+       if (r300->options.stencil_two_side_disabled)
+               _mesa_disable_extension(ctx, "GL_EXT_stencil_two_side");
+
+       if (ctx->Mesa_DXTn && !r300->options.s3tc_force_enabled) {
+               _mesa_enable_extension(ctx, "GL_EXT_texture_compression_s3tc");
+               _mesa_enable_extension(ctx, "GL_S3_s3tc");
+       } else if (r300->options.s3tc_force_disabled) {
+               _mesa_disable_extension(ctx, "GL_EXT_texture_compression_s3tc");
+       }
+}
+
 /* Create the device specific rendering context.
  */
 GLboolean r300CreateContext(const __GLcontextModes * glVisual,
@@ -340,7 +377,6 @@ GLboolean r300CreateContext(const __GLcontextModes * glVisual,
        struct dd_function_table functions;
        r300ContextPtr r300;
        GLcontext *ctx;
-       int tcl_mode;
 
        assert(glVisual);
        assert(driContextPriv);
@@ -350,11 +386,7 @@ GLboolean r300CreateContext(const __GLcontextModes * glVisual,
        if (!r300)
                return GL_FALSE;
 
-       if (!(screen->chip_flags & RADEON_CHIPSET_TCL))
-               hw_tcl_on = future_hw_tcl_on = 0;
-
-       driParseConfigFiles(&r300->radeon.optionCache, &screen->optionCache,
-                           screen->driScreen->myNum, "r300");
+       r300ParseOptions(r300, screen);
 
        r300_init_vtbl(&r300->radeon);
 
@@ -372,13 +404,14 @@ GLboolean r300CreateContext(const __GLcontextModes * glVisual,
        }
 
        ctx = r300->radeon.glCtx;
-       r300InitConstValues(ctx, screen);
 
-       if (hw_tcl_on)
+       if (r300->options.hw_tcl_enabled)
                ctx->VertexProgram._MaintainTnlProgram = GL_TRUE;
 
        ctx->FragmentProgram._MaintainTexEnvProgram = GL_TRUE;
 
+       r300InitConstValues(ctx, screen);
+
        /* Initialize the software rasterizer and helper modules.
         */
        _swrast_CreateContext(ctx);
@@ -400,56 +433,21 @@ GLboolean r300CreateContext(const __GLcontextModes * glVisual,
        _tnl_allow_pixel_fog(ctx, GL_FALSE);
        _tnl_allow_vertex_fog(ctx, GL_TRUE);
 
+       if (!r300->options.hw_tcl_enabled)
+               r300InitSwtcl(ctx);
+
        radeon_fbo_init(&r300->radeon);
-       radeonInitSpanFuncs( ctx );
+       radeonInitSpanFuncs( ctx );
        r300InitCmdBuf(r300);
        r300InitState(r300);
        r300InitShaderFunctions(r300);
-       if (!(screen->chip_flags & RADEON_CHIPSET_TCL))
-               r300InitSwtcl(ctx);
-
-       driInitExtensions(ctx, card_extensions, GL_TRUE);
-       if (r300->radeon.radeonScreen->kernel_mm)
-         driInitExtensions(ctx, mm_extensions, GL_FALSE);
 
        if (screen->chip_family == CHIP_FAMILY_RS600 || screen->chip_family == CHIP_FAMILY_RS690 ||
                screen->chip_family == CHIP_FAMILY_RS740) {
                r300->radeon.texture_row_align = 64;
        }
 
-       r300->radeon.initialMaxAnisotropy = driQueryOptionf(&r300->radeon.optionCache,
-                                                    "def_max_anisotropy");
-
-       if (driQueryOptionb(&r300->radeon.optionCache, "disable_stencil_two_side"))
-               _mesa_disable_extension(ctx, "GL_EXT_stencil_two_side");
-
-       if (ctx->Mesa_DXTn && !driQueryOptionb(&r300->radeon.optionCache, "disable_s3tc")) {
-               _mesa_enable_extension(ctx, "GL_EXT_texture_compression_s3tc");
-               _mesa_enable_extension(ctx, "GL_S3_s3tc");
-       } else if (driQueryOptionb(&r300->radeon.optionCache, "force_s3tc_enable")) {
-               _mesa_enable_extension(ctx, "GL_EXT_texture_compression_s3tc");
-       }
-
-       r300->disable_lowimpact_fallback =
-                driQueryOptionb(&r300->radeon.optionCache, "disable_lowimpact_fallback");
-
-       tcl_mode = driQueryOptioni(&r300->radeon.optionCache, "tcl_mode");
-       if (driQueryOptionb(&r300->radeon.optionCache, "no_rast")) {
-               fprintf(stderr, "disabling 3D acceleration\n");
-#if R200_MERGED
-               FALLBACK(&r300->radeon, RADEON_FALLBACK_DISABLE, 1);
-#endif
-       }
-       if (tcl_mode == DRI_CONF_TCL_SW ||
-           !(r300->radeon.radeonScreen->chip_flags & RADEON_CHIPSET_TCL)) {
-               if (r300->radeon.radeonScreen->chip_flags & RADEON_CHIPSET_TCL) {
-                       r300->radeon.radeonScreen->chip_flags &=
-                           ~RADEON_CHIPSET_TCL;
-                       fprintf(stderr, "Disabling HW TCL support\n");
-               }
-               TCL_FALLBACK(r300->radeon.glCtx,
-                            RADEON_TCL_FALLBACK_TCL_DISABLE, 1);
-       }
+       r300InitGLExtensions(ctx);
 
        return GL_TRUE;
 }
index d45e4beec0b1eedb7d244853b6846d83ee8378ed..ad8b5a2ae4550213712c65b42bb474c05a129610 100644 (file)
@@ -412,8 +412,6 @@ struct r300_vertex_shader_state {
        struct r300_vertex_shader_fragment program;
 };
 
-extern int hw_tcl_on;
-
 #define COLOR_IS_RGBA
 #define TAG(x) r300##x
 #include "tnl_dd/t_dd_vertex.h"
@@ -648,6 +646,14 @@ struct r300_context {
 
        GLboolean disable_lowimpact_fallback;
 
+       struct r300_options {
+               uint32_t conformance_mode:1;
+               uint32_t hw_tcl_enabled:1;
+               uint32_t s3tc_force_enabled:1;
+               uint32_t s3tc_force_disabled:1;
+               uint32_t stencil_two_side_disabled:1;
+       } options;
+       
        struct r300_swtcl_info swtcl;
        GLboolean vap_flush_needed;
 
index a19b0f19605d58fdedac3adc9939544472822b9c..20b77bc9aea0a95d2b91bac21861599d220065db 100644 (file)
@@ -214,7 +214,7 @@ int r300EmitArrays(GLcontext * ctx)
        struct r300_vertex_program *prog =
            (struct r300_vertex_program *)CURRENT_VERTEX_SHADER(ctx);
 
-       if (hw_tcl_on) {
+       if (rmesa->options.hw_tcl_enabled) {
                inputs = prog->inputs;
                InputsRead = prog->key.InputsRead;
                OutputsWritten = prog->key.OutputsWritten;
index a7f5121da742cef96a7600d58eea8abfbc83b945..6766eb3eaeec32f45dd188dcac8323f961ee44be 100644 (file)
@@ -215,12 +215,11 @@ static void r300EmitClearState(GLcontext * ctx)
        BATCH_LOCALS(&r300->radeon);
        __DRIdrawablePrivate *dPriv = r300->radeon.dri.drawable;
        int i;
-       int has_tcl = 1;
+       int has_tcl;
        int is_r500 = 0;
        GLuint vap_cntl;
 
-       if (!(r300->radeon.radeonScreen->chip_flags & RADEON_CHIPSET_TCL))
-               has_tcl = 0;
+       has_tcl = r300->options.hw_tcl_enabled;
 
        if (r300->radeon.radeonScreen->chip_family >= CHIP_FAMILY_RV515)
                is_r500 = 1;
index f87fee4af651b57b4e45526daaf76bab411d9340..93fdc575885e2b32f0f5778a3db422187ad47b15 100644 (file)
@@ -74,8 +74,6 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
 #include "r300_emit.h"
 #include "r300_fragprog_common.h"
 
-extern int future_hw_tcl_on;
-
 /**
  * \brief Convert a OpenGL primitive type into a R300 primitive type.
  */
@@ -468,8 +466,8 @@ 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;
@@ -483,16 +481,14 @@ 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;
        }
 
@@ -503,7 +499,7 @@ static GLboolean r300RunTCLRender(GLcontext * ctx,
 
        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;
        }
 
index 7a025aa56f5aaa5b9911a223fbc106a81ec2f1b4..873ac4aaec6993e77b437a90468f3b9f11ccec08 100644 (file)
@@ -67,8 +67,6 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 #include "drirenderbuffer.h"
 
-extern int future_hw_tcl_on;
-
 static void r300BlendColor(GLcontext * ctx, const GLfloat cf[4])
 {
        r300ContextPtr rmesa = R300_CONTEXT(ctx);
@@ -367,7 +365,7 @@ static void r300ClipPlane( GLcontext *ctx, GLenum plane, const GLfloat *eq )
        GLint *ip;
 
        /* no VAP UCP on non-TCL chipsets */
-       if (!(rmesa->radeon.radeonScreen->chip_flags & RADEON_CHIPSET_TCL))
+       if (!rmesa->options.hw_tcl_enabled)
                        return;
 
        p = (GLint) plane - (GLint) GL_CLIP_PLANE0;
@@ -386,7 +384,7 @@ static void r300SetClipPlaneState(GLcontext * ctx, GLenum cap, GLboolean state)
        GLuint p;
 
        /* no VAP UCP on non-TCL chipsets */
-       if (!(r300->radeon.radeonScreen->chip_flags & RADEON_CHIPSET_TCL))
+       if (!r300->options.hw_tcl_enabled)
                return;
 
        p = cap - GL_CLIP_PLANE0;
@@ -1416,8 +1414,9 @@ static void r300SetupRSUnit(GLcontext * ctx)
        int fp_reg, high_rr;
        int col_ip, tex_ip;
        int rs_tex_count = 0;
-       int i, count, col_fmt;
+       int i, count, col_fmt, hw_tcl_on;
 
+       hw_tcl_on = r300->options.hw_tcl_enabled;
        if (hw_tcl_on)
                OutputsWritten.vp_outputs = CURRENT_VERTEX_SHADER(ctx)->key.OutputsWritten;
        else
@@ -1552,8 +1551,9 @@ static void r500SetupRSUnit(GLcontext * ctx)
        int fp_reg, high_rr;
        int col_ip, tex_ip;
        int rs_tex_count = 0;
-       int i, count, col_fmt;
+       int i, count, col_fmt, hw_tcl_on;
 
+       hw_tcl_on = r300->options.hw_tcl_enabled;
        if (hw_tcl_on)
                OutputsWritten.vp_outputs = CURRENT_VERTEX_SHADER(ctx)->key.OutputsWritten;
        else
@@ -1764,7 +1764,7 @@ static void r300VapCntl(r300ContextPtr rmesa, GLuint input_count,
     pvs_num_cntrls = MIN2(6, vtx_mem_size/temp_count);
 
     R300_STATECHANGE(rmesa, vap_cntl);
-    if (rmesa->radeon.radeonScreen->chip_flags & RADEON_CHIPSET_TCL) {
+    if (rmesa->options.hw_tcl_enabled) {
        rmesa->hw.vap_cntl.cmd[R300_VAP_CNTL_INSTR] =
            (pvs_num_slots << R300_PVS_NUM_SLOTS_SHIFT) |
            (pvs_num_cntrls << R300_PVS_NUM_CNTLRS_SHIFT) |
@@ -1894,7 +1894,7 @@ static void r300SetupVertexProgram(r300ContextPtr rmesa)
           0x400 area might have something to do with pixel shaders as it appears right after pfs programming.
           0x406 is set to { 0.0, 0.0, 1.0, 0.0 } most of the time but should change with smooth points and in other rare cases. */
        //setup_vertex_shader_fragment(rmesa, 0x406, &unk4);
-       if (hw_tcl_on && ((struct r300_vertex_program *)CURRENT_VERTEX_SHADER(ctx))->translated) {
+       if (rmesa->options.hw_tcl_enabled && ((struct r300_vertex_program *)CURRENT_VERTEX_SHADER(ctx))->translated) {
                r300SetupRealVertexProgram(rmesa);
        } else {
                /* FIXME: This needs to be replaced by vertex shader generation code. */
@@ -1972,10 +1972,9 @@ static void r300Enable(GLcontext * ctx, GLenum cap, GLboolean state)
 static void r300ResetHwState(r300ContextPtr r300)
 {
        GLcontext *ctx = r300->radeon.glCtx;
-       int has_tcl = 1;
+       int has_tcl;
 
-       if (!(r300->radeon.radeonScreen->chip_flags & RADEON_CHIPSET_TCL))
-               has_tcl = 0;
+       has_tcl = r300->options.hw_tcl_enabled;
 
        if (RADEON_DEBUG & DEBUG_STATE)
                fprintf(stderr, "%s\n", __FUNCTION__);
@@ -2193,7 +2192,7 @@ void r300UpdateShaders(r300ContextPtr rmesa)
 
        ctx = rmesa->radeon.glCtx;
 
-       if (rmesa->radeon.NewGLState && hw_tcl_on) {
+       if (rmesa->radeon.NewGLState && rmesa->options.hw_tcl_enabled) {
                rmesa->radeon.NewGLState = 0;
 
                for (i = _TNL_FIRST_MAT; i <= _TNL_LAST_MAT; i++) {
@@ -2217,7 +2216,7 @@ void r300UpdateShaders(r300ContextPtr rmesa)
                   r300TranslateVertexShader(vp); */
                if (vp->translated == GL_FALSE) {
                        fprintf(stderr, "Failing back to sw-tcl\n");
-                       hw_tcl_on = future_hw_tcl_on = 0;
+                       rmesa->options.hw_tcl_enabled = 0;
                        r300ResetHwState(rmesa);
 
                        r300UpdateStateParameters(ctx, _NEW_PROGRAM |
@@ -2425,7 +2424,7 @@ void r300UpdateShaderStates(r300ContextPtr rmesa)
 
        rmesa->vtbl.SetupRSUnit(ctx);
 
-       if ((rmesa->radeon.radeonScreen->chip_flags & RADEON_CHIPSET_TCL))
+       if (rmesa->options.hw_tcl_enabled)
                r300SetupVertexProgram(rmesa);
 }