r300: add support for more rendering formats
authorMaciej Cencora <m.cencora@gmail.com>
Sun, 7 Mar 2010 13:26:21 +0000 (14:26 +0100)
committerMaciej Cencora <m.cencora@gmail.com>
Tue, 9 Mar 2010 20:50:30 +0000 (21:50 +0100)
src/mesa/drivers/dri/r300/r300_cmdbuf.c
src/mesa/drivers/dri/r300/r300_state.c

index 6cfa5686f4a5a759a0d1b54b08b35d34be2e757e..e2dbb1dbf400aab51613dbfdfb3df691f1ec61e6 100644 (file)
@@ -332,36 +332,37 @@ void r300_emit_cb_setup(struct r300_context *r300,
     assert(offset % 32 == 0);
 
     switch (format) {
-        case MESA_FORMAT_RGB565:
-            assert(_mesa_little_endian());
-            cbpitch |= R300_COLOR_FORMAT_RGB565;
+        case MESA_FORMAT_SL8:
+        case MESA_FORMAT_A8:
+        case MESA_FORMAT_L8:
+        case MESA_FORMAT_I8:
+            cbpitch |= R300_COLOR_FORMAT_I8;
             break;
+        case MESA_FORMAT_RGB565:
         case MESA_FORMAT_RGB565_REV:
-            assert(!_mesa_little_endian());
             cbpitch |= R300_COLOR_FORMAT_RGB565;
             break;
         case MESA_FORMAT_ARGB4444:
-            assert(_mesa_little_endian());
-            cbpitch |= R300_COLOR_FORMAT_ARGB4444;
-            break;
         case MESA_FORMAT_ARGB4444_REV:
-            assert(!_mesa_little_endian());
             cbpitch |= R300_COLOR_FORMAT_ARGB4444;
             break;
+        case MESA_FORMAT_RGBA5551:
         case MESA_FORMAT_ARGB1555:
-            assert(_mesa_little_endian());
-            cbpitch |= R300_COLOR_FORMAT_ARGB1555;
-            break;
         case MESA_FORMAT_ARGB1555_REV:
-            assert(!_mesa_little_endian());
             cbpitch |= R300_COLOR_FORMAT_ARGB1555;
             break;
+        case MESA_FORMAT_RGBA8888:
+        case MESA_FORMAT_RGBA8888_REV:
+        case MESA_FORMAT_XRGB8888:
+        case MESA_FORMAT_ARGB8888:
+        case MESA_FORMAT_XRGB8888_REV:
+        case MESA_FORMAT_ARGB8888_REV:
+        case MESA_FORMAT_SRGBA8:
+        case MESA_FORMAT_SARGB8:
+            cbpitch |= R300_COLOR_FORMAT_ARGB8888;
+            break;
         default:
-            if (cpp == 4) {
-                cbpitch |= R300_COLOR_FORMAT_ARGB8888;
-            } else {
-                _mesa_problem(r300->radeon.glCtx, "unexpected format in emit_cb_offset()");;
-            }
+            _mesa_problem(r300->radeon.glCtx, "unexpected format in emit_cb_offset()");
             break;
     }
 
index 8739dcbafbb5fd158d27bd2f1614c31ebbc3b1d4..bdd12c6d220b54be1f3cb5f3a96a5358558ca870 100644 (file)
@@ -2238,6 +2238,63 @@ void r300UpdateShaderStates(r300ContextPtr rmesa)
        }
 }
 
+#define EASY_US_OUT_FMT(comps, c0, c1, c2, c3) \
+       (R500_OUT_FMT_##comps | R500_C0_SEL_##c0 | R500_C1_SEL_##c1 | \
+        R500_C2_SEL_##c2 | R500_C3_SEL_##c3)
+static void r300SetupUsOutputFormat(GLcontext *ctx)
+{
+       r300ContextPtr rmesa = R300_CONTEXT(ctx);
+       uint32_t hw_format;
+
+       switch (radeon_get_colorbuffer(&rmesa->radeon)->base.Format)
+       {
+               case MESA_FORMAT_RGBA5551:
+               case MESA_FORMAT_RGBA8888:
+                       hw_format = EASY_US_OUT_FMT(C4_8, A, B, G, R);
+                       break;
+               case MESA_FORMAT_RGB565_REV:
+               case MESA_FORMAT_RGBA8888_REV:
+                       hw_format = EASY_US_OUT_FMT(C4_8, R, G, B, A);
+                       break;
+               case MESA_FORMAT_RGB565:
+               case MESA_FORMAT_ARGB4444:
+               case MESA_FORMAT_ARGB1555:
+               case MESA_FORMAT_XRGB8888:
+               case MESA_FORMAT_ARGB8888:
+                       hw_format = EASY_US_OUT_FMT(C4_8, B, G, R, A);
+                       break;
+               case MESA_FORMAT_ARGB4444_REV:
+               case MESA_FORMAT_ARGB1555_REV:
+               case MESA_FORMAT_XRGB8888_REV:
+               case MESA_FORMAT_ARGB8888_REV:
+                       hw_format = EASY_US_OUT_FMT(C4_8, A, R, G, B);
+                       break;
+               case MESA_FORMAT_SRGBA8:
+                       hw_format = EASY_US_OUT_FMT(C4_10_GAMMA, A, B, G, R);
+                       break;
+               case MESA_FORMAT_SARGB8:
+                       hw_format = EASY_US_OUT_FMT(C4_10_GAMMA, B, G, R, A);
+                       break;
+               case MESA_FORMAT_SL8:
+                       hw_format = EASY_US_OUT_FMT(C4_10_GAMMA, A, A, R, A);
+                       break;
+               case MESA_FORMAT_A8:
+                       hw_format = EASY_US_OUT_FMT(C4_8, A, A, A, A);
+                       break;
+               case MESA_FORMAT_L8:
+               case MESA_FORMAT_I8:
+                       hw_format = EASY_US_OUT_FMT(C4_8, A, A, R, A);
+                       break;
+               default:
+                       assert(!"Unsupported format");
+                       break;
+       }
+
+       R300_STATECHANGE(rmesa, us_out_fmt);
+       rmesa->hw.us_out_fmt.cmd[1] = hw_format;
+}
+#undef EASY_US_OUT_FMT
+
 /**
  * Called by Mesa after an internal state update.
  */
@@ -2267,6 +2324,10 @@ static void r300InvalidateState(GLcontext * ctx, GLuint new_state)
                        r300->hw.shade2.cmd[1] &= ~R300_GA_COLOR_CONTROL_PROVOKING_VERTEX_LAST;
        }
 
+       if (new_state & _NEW_BUFFERS) {
+               r300SetupUsOutputFormat(ctx);
+       }
+
        r300->radeon.NewGLState |= new_state;
 }