nvfx: support rendering to more formats
authorLuca Barbieri <luca@luca-barbieri.com>
Sat, 4 Sep 2010 19:29:43 +0000 (21:29 +0200)
committerLuca Barbieri <luca@luca-barbieri.com>
Sat, 4 Sep 2010 20:45:21 +0000 (22:45 +0200)
src/gallium/drivers/nouveau/nouveau_class.h
src/gallium/drivers/nvfx/nvfx_screen.c
src/gallium/drivers/nvfx/nvfx_screen.h
src/gallium/drivers/nvfx/nvfx_state_fb.c

index 79681d277beaf0816c03247f9c42fe88bd1cfa86..72ddf9bf760c5a049d4252294ff0f63abb699ec1 100644 (file)
@@ -5003,7 +5003,9 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #define    NV34TCL_RT_FORMAT_COLOR_X8R8G8B8                                            0x00000005
 #define    NV34TCL_RT_FORMAT_COLOR_A8R8G8B8                                            0x00000008
 #define    NV34TCL_RT_FORMAT_COLOR_B8                                                  0x00000009
-#define    NV34TCL_RT_FORMAT_COLOR_UNKNOWN                                             0x0000000d
+#define    NV34TCL_RT_FORMAT_COLOR_A16B16G16R16_FLOAT                                  0x0000000b
+#define    NV34TCL_RT_FORMAT_COLOR_A32B32G32R32_FLOAT                                  0x0000000c
+#define    NV34TCL_RT_FORMAT_COLOR_R32_FLOAT                                           0x0000000d
 #define    NV34TCL_RT_FORMAT_COLOR_X8B8G8R8                                            0x0000000f
 #define    NV34TCL_RT_FORMAT_COLOR_A8B8G8R8                                            0x00000010
 #define  NV34TCL_COLOR0_PITCH                                                          0x0000020c
index e01b2a6133b33c27339f304b72abb432d872357a..9056a56f98256382d8702dfe6c13ea4a998c0e78 100644 (file)
@@ -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 */
index 1b79235ae0d294d62c5329b99ccbc467dedc449b..566fcb12085713c5d0fb9206ec2ccfbd6672fea5 100644 (file)
@@ -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;
index 667b0843c0d5cc4ac43f7b1825832687176f7c45..4b82c68765b8c8245cfcebcec52b8f4cdc96e9e8 100644 (file)
@@ -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);
                }