summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJosé Fonseca <[email protected]>2013-01-29 13:27:44 +0000
committerJosé Fonseca <[email protected]>2013-01-29 16:41:56 +0000
commit42f762dcf682957a8a5c85ca1d30b28f41ea4bd0 (patch)
treed276e9294d1f1218e374d43c1320b376ee265ad4
parent3b683700efe81f82ba2f978d6c645385e5ccfa97 (diff)
llvmpipe: Don't advertise S8_UNORM (with feeble attempt at supporting it).
S8_UNORM was inadvertedly supported together with Z16_UNORM. I tried to update the code to accomodate stencil-only -- it seemed a simple thing to do -- but "fbo-stencil clear GL_STENCIL_INDEX8" still fails, and it's not worth debugging. Therefore although this change tries to update for S8_UNORM, it also disables it completely. Reviewed-by: Brian Paul <[email protected]> Reviewed-by: Roland Scheidegger <[email protected]>
-rw-r--r--src/gallium/drivers/llvmpipe/lp_bld_depth.c75
-rw-r--r--src/gallium/drivers/llvmpipe/lp_screen.c7
2 files changed, 46 insertions, 36 deletions
diff --git a/src/gallium/drivers/llvmpipe/lp_bld_depth.c b/src/gallium/drivers/llvmpipe/lp_bld_depth.c
index 24c997d4624..b9dbdc5a8ac 100644
--- a/src/gallium/drivers/llvmpipe/lp_bld_depth.c
+++ b/src/gallium/drivers/llvmpipe/lp_bld_depth.c
@@ -306,35 +306,35 @@ lp_depth_type(const struct util_format_description *format_desc,
unsigned length)
{
struct lp_type type;
- unsigned swizzle;
+ unsigned z_swizzle;
assert(format_desc->colorspace == UTIL_FORMAT_COLORSPACE_ZS);
assert(format_desc->block.width == 1);
assert(format_desc->block.height == 1);
- swizzle = format_desc->swizzle[0];
- assert(swizzle < 4);
-
memset(&type, 0, sizeof type);
type.width = format_desc->block.bits;
- if(format_desc->channel[swizzle].type == UTIL_FORMAT_TYPE_FLOAT) {
- type.floating = TRUE;
- assert(swizzle == 0);
- assert(format_desc->channel[swizzle].size == format_desc->block.bits);
- }
- else if(format_desc->channel[swizzle].type == UTIL_FORMAT_TYPE_UNSIGNED) {
- assert(format_desc->block.bits <= 32);
- assert(format_desc->channel[swizzle].normalized);
- if (format_desc->channel[swizzle].size < format_desc->block.bits) {
- /* Prefer signed integers when possible, as SSE has less support
- * for unsigned comparison;
- */
- type.sign = TRUE;
+ z_swizzle = format_desc->swizzle[0];
+ if (z_swizzle < 4) {
+ if (format_desc->channel[z_swizzle].type == UTIL_FORMAT_TYPE_FLOAT) {
+ type.floating = TRUE;
+ assert(z_swizzle == 0);
+ assert(format_desc->channel[z_swizzle].size == format_desc->block.bits);
+ }
+ else if(format_desc->channel[z_swizzle].type == UTIL_FORMAT_TYPE_UNSIGNED) {
+ assert(format_desc->block.bits <= 32);
+ assert(format_desc->channel[z_swizzle].normalized);
+ if (format_desc->channel[z_swizzle].size < format_desc->block.bits) {
+ /* Prefer signed integers when possible, as SSE has less support
+ * for unsigned comparison;
+ */
+ type.sign = TRUE;
+ }
}
+ else
+ assert(0);
}
- else
- assert(0);
type.length = length;
@@ -604,24 +604,29 @@ lp_build_depth_stencil_test(struct gallivm_state *gallivm,
assert(format_desc->block.height == 1);
if (stencil[0].enabled) {
- assert(format_desc->format == PIPE_FORMAT_Z24_UNORM_S8_UINT ||
- format_desc->format == PIPE_FORMAT_S8_UINT_Z24_UNORM);
+ assert(s_swizzle < 4);
+ assert(format_desc->channel[s_swizzle].type == UTIL_FORMAT_TYPE_UNSIGNED);
+ assert(format_desc->channel[s_swizzle].pure_integer);
+ assert(!format_desc->channel[s_swizzle].normalized);
+ assert(format_desc->channel[s_swizzle].size == 8);
}
- assert(z_swizzle < 4);
- assert(format_desc->block.bits <= z_type.width);
- if (z_type.floating) {
- assert(z_swizzle == 0);
- assert(format_desc->channel[z_swizzle].type ==
- UTIL_FORMAT_TYPE_FLOAT);
- assert(format_desc->channel[z_swizzle].size ==
- format_desc->block.bits);
- }
- else {
- assert(format_desc->channel[z_swizzle].type ==
- UTIL_FORMAT_TYPE_UNSIGNED);
- assert(format_desc->channel[z_swizzle].normalized);
- assert(!z_type.fixed);
+ if (depth->enabled) {
+ assert(z_swizzle < 4);
+ assert(format_desc->block.bits <= z_type.width);
+ if (z_type.floating) {
+ assert(z_swizzle == 0);
+ assert(format_desc->channel[z_swizzle].type ==
+ UTIL_FORMAT_TYPE_FLOAT);
+ assert(format_desc->channel[z_swizzle].size ==
+ format_desc->block.bits);
+ }
+ else {
+ assert(format_desc->channel[z_swizzle].type ==
+ UTIL_FORMAT_TYPE_UNSIGNED);
+ assert(format_desc->channel[z_swizzle].normalized);
+ assert(!z_type.fixed);
+ }
}
}
diff --git a/src/gallium/drivers/llvmpipe/lp_screen.c b/src/gallium/drivers/llvmpipe/lp_screen.c
index de80c6fdc6b..3769428a971 100644
--- a/src/gallium/drivers/llvmpipe/lp_screen.c
+++ b/src/gallium/drivers/llvmpipe/lp_screen.c
@@ -356,9 +356,14 @@ llvmpipe_is_format_supported( struct pipe_screen *_screen,
if (format_desc->colorspace != UTIL_FORMAT_COLORSPACE_ZS)
return FALSE;
- /* FIXME: Temporary restriction. See lp_bld_depth.c. */
+ /* TODO: Support Z32_FLOAT_S8X24_UINT. See lp_bld_depth.c. */
if (format_desc->block.bits > 32)
return FALSE;
+
+ /* TODO: Support stencil-only formats */
+ if (format_desc->swizzle[0] == UTIL_FORMAT_SWIZZLE_NONE) {
+ return FALSE;
+ }
}
if (format_desc->layout == UTIL_FORMAT_LAYOUT_S3TC) {