i915: Add optional support for ARB_fragment_shader under a driconf option.
authorEric Anholt <eric@anholt.net>
Wed, 29 Jul 2009 20:00:09 +0000 (13:00 -0700)
committerEric Anholt <eric@anholt.net>
Thu, 1 Oct 2009 21:52:44 +0000 (14:52 -0700)
Other vendors have enabled ARB_fragment_shader as part of OpenGL 2.0
enablement even on hardware like the 915 with no dynamic branching or
dFdx/dFdy support.  But for now we'll leave it disabled because we don't
do any flattening of ifs or loops, which is rather restrictive.

This support is not complete, and may be unstable depending on your shaders.
It passes 10/15 of the piglit glsl tests, but hangs on glean glsl1.

src/mesa/drivers/dri/i915/i915_fragprog.c
src/mesa/drivers/dri/intel/intel_context.h
src/mesa/drivers/dri/intel/intel_extensions.c
src/mesa/drivers/dri/intel/intel_screen.c

index d5659e762f30a8049f9403882205ca2c3248a4df..d9c61446f52d8e8bcbafceafe5019a60c0111011 100644 (file)
@@ -160,6 +160,7 @@ src_vector(struct i915_fragment_program *p,
    case PROGRAM_CONSTANT:
    case PROGRAM_STATE_VAR:
    case PROGRAM_NAMED_PARAM:
+   case PROGRAM_UNIFORM:
       src =
          i915_emit_param4fv(p,
                             program->Base.Parameters->ParameterValues[source->
index c743ab1c2462695626086dd8788bd3a13af12e3c..b104096912cc49a07a9960fce7368cbbc6d24400 100644 (file)
@@ -293,7 +293,6 @@ struct intel_context
 
    GLboolean use_texture_tiling;
    GLboolean use_early_z;
-
    drm_clip_rect_t fboRect;     /**< cliprect for FBO rendering */
 
    int perf_boxes;
index f10eda7cc7a7ac5600a2a645abc267218e2bd7f1..6831cbbfc856ff64d3f465449c0fc3d657f3d3b3 100644 (file)
@@ -182,6 +182,10 @@ static const struct dri_extension ttm_extensions[] = {
    { NULL, NULL }
 };
 
+static const struct dri_extension fragment_shader_extensions[] = {
+   { "GL_ARB_fragment_shader",            NULL },
+   { NULL, NULL }
+};
 
 /**
  * Initializes potential list of extensions if ctx == NULL, or actually enables
@@ -205,6 +209,10 @@ intelInitExtensions(GLcontext *ctx, GLboolean enable_imaging)
       driInitExtensions(ctx, brw_extensions, GL_FALSE);
 
    if (intel == NULL || IS_915(intel->intelScreen->deviceID)
-       || IS_945(intel->intelScreen->deviceID))
+       || IS_945(intel->intelScreen->deviceID)) {
       driInitExtensions(ctx, i915_extensions, GL_FALSE);
+
+      if (intel == NULL || driQueryOptionb(&intel->optionCache, "fragment_shader"))
+        driInitExtensions(ctx, fragment_shader_extensions, GL_FALSE);
+   }
 }
index 1b8c56e68d6c89c42c90cf92c6bf04c90ae70610..2478e6363731c609a5858fbaf2613e95f3a066e1 100644 (file)
@@ -79,6 +79,10 @@ PUBLIC const char __driConfigOptions[] =
         DRI_CONF_DESC(en, "Enable early Z in classic mode (unstable, 945-only).")
       DRI_CONF_OPT_END
 
+      DRI_CONF_OPT_BEGIN(fragment_shader, bool, false)
+        DRI_CONF_DESC(en, "Enable limited ARB_fragment_shader support on 915/945.")
+      DRI_CONF_OPT_END
+
    DRI_CONF_SECTION_END
    DRI_CONF_SECTION_QUALITY
       DRI_CONF_FORCE_S3TC_ENABLE(false)
@@ -91,7 +95,7 @@ PUBLIC const char __driConfigOptions[] =
    DRI_CONF_SECTION_END
 DRI_CONF_END;
 
-const GLuint __driNConfigOptions = 10;
+const GLuint __driNConfigOptions = 11;
 
 #ifdef USE_NEW_INTERFACE
 static PFNGLXCREATECONTEXTMODES create_context_modes = NULL;