i965: Enable GL_ARB_texture_rg
authorIan Romanick <ian.d.romanick@intel.com>
Fri, 20 Nov 2009 18:45:36 +0000 (10:45 -0800)
committerIan Romanick <ian.d.romanick@intel.com>
Fri, 1 Oct 2010 22:49:13 +0000 (15:49 -0700)
src/mesa/drivers/dri/i965/brw_wm_surface_state.c
src/mesa/drivers/dri/intel/intel_extensions.c
src/mesa/drivers/dri/intel/intel_fbo.c
src/mesa/drivers/dri/intel/intel_tex_format.c

index 05f1aa1813749c874d0d0ff75eec551985441876..37104f1f2386590bb759374943b25e4bb0187f4d 100644 (file)
@@ -89,6 +89,18 @@ static GLuint translate_tex_format( gl_format mesa_format,
    case MESA_FORMAT_AL1616:
       return BRW_SURFACEFORMAT_L16A16_UNORM;
 
+   case MESA_FORMAT_R8:
+      return BRW_SURFACEFORMAT_R8_UNORM;
+
+   case MESA_FORMAT_R16:
+      return BRW_SURFACEFORMAT_R16_UNORM;
+
+   case MESA_FORMAT_RG88:
+      return BRW_SURFACEFORMAT_R8G8_UNORM;
+
+   case MESA_FORMAT_RG1616:
+      return BRW_SURFACEFORMAT_R16G16_UNORM;
+
    case MESA_FORMAT_RGB888:
       assert(0);               /* not supported for sampling */
       return BRW_SURFACEFORMAT_R8G8B8_UNORM;      
@@ -444,6 +456,18 @@ brw_update_renderbuffer_surface(struct brw_context *brw,
       case MESA_FORMAT_A8:
         key.surface_format = BRW_SURFACEFORMAT_A8_UNORM;
         break;
+      case MESA_FORMAT_R8:
+        key.surface_format = BRW_SURFACEFORMAT_R8_UNORM;
+        break;
+      case MESA_FORMAT_R16:
+        key.surface_format = BRW_SURFACEFORMAT_R16_UNORM;
+        break;
+      case MESA_FORMAT_RG88:
+        key.surface_format = BRW_SURFACEFORMAT_R8G8_UNORM;
+        break;
+      case MESA_FORMAT_RG1616:
+        key.surface_format = BRW_SURFACEFORMAT_R16G16_UNORM;
+        break;
       default:
         _mesa_problem(ctx, "Bad renderbuffer format: %d\n", irb->Base.Format);
       }
index d741f8276783f61d2bdc881f00d3861dc1e9682a..b1b29d85266b6a62ee27765474f25f03ed767999 100644 (file)
@@ -166,6 +166,7 @@ static const struct dri_extension brw_extensions[] = {
    { "GL_ARB_shadow",                     NULL },
    { "GL_MESA_texture_signed_rgba",       NULL },
    { "GL_ARB_texture_non_power_of_two",   NULL },
+   { "GL_ARB_texture_rg",                 NULL },
    { "GL_EXT_draw_buffers2",              GL_EXT_draw_buffers2_functions },
    { "GL_EXT_shadow_funcs",               NULL },
    { "GL_EXT_stencil_two_side",           GL_EXT_stencil_two_side_functions },
index 8c0491d59aa286db7cdb942d1bb5682fabc3e1e7..a70c83b39da3cd98e3b19848a949717e036c38e0 100644 (file)
@@ -107,6 +107,24 @@ intel_alloc_renderbuffer_storage(GLcontext * ctx, struct gl_renderbuffer *rb,
    ASSERT(rb->Name != 0);
 
    switch (internalFormat) {
+   case GL_RED:
+   case GL_R8:
+      rb->Format = MESA_FORMAT_R8;
+      rb->DataType = GL_UNSIGNED_BYTE;
+      break;
+   case GL_R16:
+      rb->Format = MESA_FORMAT_R16;
+      rb->DataType = GL_UNSIGNED_SHORT;
+      break;
+   case GL_RG:
+   case GL_RG8:
+      rb->Format = MESA_FORMAT_RG88;
+      rb->DataType = GL_UNSIGNED_BYTE;
+      break;
+   case GL_RG16:
+      rb->Format = MESA_FORMAT_RG1616;
+      rb->DataType = GL_UNSIGNED_SHORT;
+      break;
    case GL_R3_G3_B2:
    case GL_RGB4:
    case GL_RGB5:
@@ -346,6 +364,14 @@ intel_create_renderbuffer(gl_format format)
       irb->Base._BaseFormat = GL_ALPHA;
       irb->Base.DataType = GL_UNSIGNED_BYTE;
       break;
+   case MESA_FORMAT_R8:
+      irb->Base._BaseFormat = GL_RED;
+      irb->Base.DataType = GL_UNSIGNED_BYTE;
+      break;
+   case MESA_FORMAT_RG88:
+      irb->Base._BaseFormat = GL_RG;
+      irb->Base.DataType = GL_UNSIGNED_BYTE;
+      break;
    default:
       _mesa_problem(NULL,
                     "Unexpected intFormat in intel_create_renderbuffer");
@@ -459,6 +485,22 @@ intel_update_wrapper(GLcontext *ctx, struct intel_renderbuffer *irb,
       irb->Base.DataType = GL_UNSIGNED_BYTE;
       DBG("Render to A8 texture OK\n");
    }
+   else if (texImage->TexFormat == MESA_FORMAT_R8) {
+      irb->Base.DataType = GL_UNSIGNED_BYTE;
+      DBG("Render to R8 texture OK\n");
+   }
+   else if (texImage->TexFormat == MESA_FORMAT_RG88) {
+      irb->Base.DataType = GL_UNSIGNED_BYTE;
+      DBG("Render to RG88 texture OK\n");
+   }
+   else if (texImage->TexFormat == MESA_FORMAT_R16) {
+      irb->Base.DataType = GL_UNSIGNED_SHORT;
+      DBG("Render to R8 texture OK\n");
+   }
+   else if (texImage->TexFormat == MESA_FORMAT_RG1616) {
+      irb->Base.DataType = GL_UNSIGNED_SHORT;
+      DBG("Render to RG88 texture OK\n");
+   }
    else if (texImage->TexFormat == MESA_FORMAT_Z16) {
       irb->Base.DataType = GL_UNSIGNED_SHORT;
       DBG("Render to DEPTH16 texture OK\n");
@@ -673,6 +715,10 @@ intel_validate_framebuffer(GLcontext *ctx, struct gl_framebuffer *fb)
       case MESA_FORMAT_ARGB1555:
       case MESA_FORMAT_ARGB4444:
       case MESA_FORMAT_A8:
+      case MESA_FORMAT_R8:
+      case MESA_FORMAT_R16:
+      case MESA_FORMAT_RG88:
+      case MESA_FORMAT_RG1616:
         break;
       default:
         fb->_Status = GL_FRAMEBUFFER_UNSUPPORTED_EXT;
index e03b203fb406981a7168a12b88ee1c8c93755846..97b26efcb7c163449797c1c5b37725c5e3f1f484 100644 (file)
@@ -93,6 +93,10 @@ intelChooseTextureFormat(GLcontext * ctx, GLint internalFormat,
    case GL_LUMINANCE12_ALPHA4:
    case GL_LUMINANCE12_ALPHA12:
    case GL_LUMINANCE16_ALPHA16:
+      /* i915 could implement this mode using MT_32BIT_RG1616.  However, this
+       * would require an extra swizzle instruction in the fragment shader to
+       * convert the { R, G, 1.0, 1.0 } to { R, R, R, G }.
+       */
 #ifndef I915
       return MESA_FORMAT_AL1616;
 #else
@@ -193,6 +197,22 @@ intelChooseTextureFormat(GLcontext * ctx, GLint internalFormat,
    case GL_RGBA_SNORM:
    case GL_RGBA8_SNORM:
       return MESA_FORMAT_SIGNED_RGBA8888_REV;
+
+   /* i915 can do a RG16, but it can't do any of the other RED or RG formats.
+    * In addition, it only implements the broken D3D mode where undefined
+    * components are read as 1.0.  I'm not sure who thought reading
+    * { R, G, 1.0, 1.0 } from a red-green texture would be useful.
+    */
+   case GL_RED:
+   case GL_R8:
+      return MESA_FORMAT_R8;
+   case GL_R16:
+      return MESA_FORMAT_R16;
+   case GL_RG:
+   case GL_RG8:
+      return MESA_FORMAT_RG88;
+   case GL_RG16:
+      return MESA_FORMAT_RG1616;
 #endif
 
    default: