r300: add support for more rendering formats

This commit is contained in:
Maciej Cencora
2010-03-07 14:26:21 +01:00
parent a17563c7dd
commit fd05067c99
2 changed files with 79 additions and 17 deletions
+18 -17
View 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());
case MESA_FORMAT_ARGB1555_REV:
cbpitch |= R300_COLOR_FORMAT_ARGB1555;
break;
case MESA_FORMAT_ARGB1555_REV:
assert(!_mesa_little_endian());
cbpitch |= R300_COLOR_FORMAT_ARGB1555;
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;
}
+61
View 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;
}