summaryrefslogtreecommitdiff
path: root/src/gallium/drivers/nvfx
diff options
context:
space:
mode:
authorLuca Barbieri <luca@luca-barbieri.com>2010-09-04 21:29:43 +0200
committerLuca Barbieri <luca@luca-barbieri.com>2010-09-04 22:45:21 +0200
commit20bf5037d6006329b362fe501cc8a3594a0cab24 (patch)
tree8acb5197433d742756261c47f686a4da59b3e5a2 /src/gallium/drivers/nvfx
parent25ecc9521dcab781a8a3688ab331fdaee34a4fff (diff)
nvfx: support rendering to more formats
Diffstat (limited to 'src/gallium/drivers/nvfx')
-rw-r--r--src/gallium/drivers/nvfx/nvfx_screen.c20
-rw-r--r--src/gallium/drivers/nvfx/nvfx_screen.h2
-rw-r--r--src/gallium/drivers/nvfx/nvfx_state_fb.c6
3 files changed, 27 insertions, 1 deletions
diff --git a/src/gallium/drivers/nvfx/nvfx_screen.c b/src/gallium/drivers/nvfx/nvfx_screen.c
index e01b2a6133..9056a56f98 100644
--- a/src/gallium/drivers/nvfx/nvfx_screen.c
+++ b/src/gallium/drivers/nvfx/nvfx_screen.c
@@ -168,6 +168,14 @@ nvfx_screen_is_format_supported(struct pipe_screen *pscreen,
case PIPE_FORMAT_B8G8R8X8_UNORM:
case PIPE_FORMAT_B5G6R5_UNORM:
break;
+ case PIPE_FORMAT_R16G16B16A16_FLOAT:
+ if(!screen->advertise_fp16)
+ return FALSE;
+ break;
+ case PIPE_FORMAT_R32G32B32A32_FLOAT:
+ if(!screen->advertise_fp32)
+ return FALSE;
+ break;
default:
return FALSE;
}
@@ -188,7 +196,10 @@ nvfx_screen_is_format_supported(struct pipe_screen *pscreen,
struct nvfx_texture_format* tf = &nvfx_texture_formats[format];
if(util_format_is_s3tc(format) && !util_format_s3tc_enabled)
return FALSE;
-
+ if(format == PIPE_FORMAT_R16G16B16A16_FLOAT && !screen->advertise_fp16)
+ return FALSE;
+ if(format == PIPE_FORMAT_R32G32B32A32_FLOAT && !screen->advertise_fp32)
+ return FALSE;
if(screen->is_nv4x)
{
if(tf->fmt[4] < 0)
@@ -428,6 +439,13 @@ nvfx_screen_create(struct pipe_winsys *ws, struct nouveau_device *dev)
screen->inline_cost_per_hardware_cost = atof(debug_get_option("NVFX_INLINE_COST_PER_HARDWARE_COST", "1.0"));
screen->static_reuse_threshold = atof(debug_get_option("NVFX_STATIC_REUSE_THRESHOLD", "2.0"));
+ /* We don't advertise these by default because filtering and blending doesn't work as
+ * it should, due to several restrictions.
+ * The only exception is fp16 on nv40.
+ */
+ screen->advertise_fp16 = debug_get_bool_option("NVFX_FP16", !!screen->is_nv4x);
+ screen->advertise_fp32 = debug_get_bool_option("NVFX_FP32", 0);
+
screen->vertex_buffer_reloc_flags = nvfx_screen_get_vertex_buffer_flags(screen);
/* surely both nv3x and nv44 support index buffers too: find out how and test that */
diff --git a/src/gallium/drivers/nvfx/nvfx_screen.h b/src/gallium/drivers/nvfx/nvfx_screen.h
index 1b79235ae0..566fcb1208 100644
--- a/src/gallium/drivers/nvfx/nvfx_screen.h
+++ b/src/gallium/drivers/nvfx/nvfx_screen.h
@@ -19,6 +19,8 @@ struct nvfx_screen {
boolean trace_draw;
unsigned vertex_buffer_reloc_flags;
unsigned index_buffer_reloc_flags;
+ unsigned advertise_fp16;
+ unsigned advertise_fp32;
/* HW graphics objects */
struct nouveau_grobj *eng3d;
diff --git a/src/gallium/drivers/nvfx/nvfx_state_fb.c b/src/gallium/drivers/nvfx/nvfx_state_fb.c
index 667b0843c0..4b82c68765 100644
--- a/src/gallium/drivers/nvfx/nvfx_state_fb.c
+++ b/src/gallium/drivers/nvfx/nvfx_state_fb.c
@@ -143,6 +143,12 @@ nvfx_framebuffer_validate(struct nvfx_context *nvfx, unsigned prepare_result)
case PIPE_FORMAT_B5G6R5_UNORM:
rt_format |= NV34TCL_RT_FORMAT_COLOR_R5G6B5;
break;
+ case PIPE_FORMAT_R32G32B32A32_FLOAT:
+ rt_format |= NV34TCL_RT_FORMAT_COLOR_A32B32G32R32_FLOAT;
+ break;
+ case PIPE_FORMAT_R16G16B16A16_FLOAT:
+ rt_format |= NV34TCL_RT_FORMAT_COLOR_A16B16G16R16_FLOAT;
+ break;
default:
assert(0);
}