Merge remote branch 'origin/master' into pipe-video
[mesa.git] / src / gallium / drivers / nvfx / nvfx_screen.c
index 875b3a96ca693847db87a1ca8cbb51beec3256f7..4a97dfb9c252f7dad373d448c969d4bf23692cea 100644 (file)
@@ -1,5 +1,6 @@
 #include "pipe/p_screen.h"
 #include "pipe/p_state.h"
+#include "util/u_format.h"
 #include "util/u_format_s3tc.h"
 #include "util/u_simple_screen.h"
 
@@ -38,7 +39,7 @@ nvfx_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
        case PIPE_CAP_POINT_SPRITE:
                return 1;
        case PIPE_CAP_MAX_RENDER_TARGETS:
-               return screen->use_nv4x ? 4 : 2;
+               return screen->use_nv4x ? 4 : 1;
        case PIPE_CAP_OCCLUSION_QUERY:
                return 1;
         case PIPE_CAP_TIMER_QUERY:
@@ -78,6 +79,12 @@ nvfx_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
                return 1;
        case PIPE_CAP_DEPTH_CLAMP:
                return 0; // TODO: implement depth clamp
+       case PIPE_CAP_PRIMITIVE_RESTART:
+               return 0; // TODO: implement primitive restart
+       case PIPE_CAP_SHADER_STENCIL_EXPORT:
+               return 0;
+       case PIPE_CAP_MIXED_COLORBUFFER_FORMATS:
+                return 0;
        default:
                NOUVEAU_ERR("Warning: unknown PIPE_CAP %d\n", param);
                return 0;
@@ -115,6 +122,13 @@ nvfx_screen_get_shader_param(struct pipe_screen *pscreen, unsigned shader, enum
                        return 0; /* we could expose these, but nothing uses them */
                case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
                    return 0;
+               case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR:
+               case PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR:
+               case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:
+               case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:
+                       return 0;
+               case PIPE_SHADER_CAP_SUBROUTINES:
+                       return screen->use_nv4x ? 1 : 0;
                default:
                        break;
                }
@@ -147,6 +161,14 @@ nvfx_screen_get_shader_param(struct pipe_screen *pscreen, unsigned shader, enum
                        return 0; /* we could expose these, but nothing uses them */
                case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
                         return 1;
+               case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR:
+               case PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR:
+               case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:
+                       return 0;
+               case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR:
+                       return 1;
+               case PIPE_SHADER_CAP_SUBROUTINES:
+                       return 1;
                default:
                        break;
                }
@@ -184,10 +206,13 @@ nvfx_screen_is_format_supported(struct pipe_screen *pscreen,
                                     enum pipe_format format,
                                     enum pipe_texture_target target,
                                     unsigned sample_count,
-                                    unsigned bind, unsigned geom_flags)
+                                     unsigned bind)
 {
        struct nvfx_screen *screen = nvfx_screen(pscreen);
 
+        if (!util_format_is_supported(format, bind))
+                return FALSE;
+
         if (sample_count > 1)
                return FALSE;
 
@@ -283,98 +308,100 @@ nvfx_screen_destroy(struct pipe_screen *pscreen)
 static void nv30_screen_init(struct nvfx_screen *screen)
 {
        struct nouveau_channel *chan = screen->base.channel;
+       struct nouveau_grobj *eng3d = screen->eng3d;
        int i;
 
        /* TODO: perhaps we should do some of this on nv40 too? */
        for (i=1; i<8; i++) {
-               OUT_RING(chan, RING_3D(NV30_3D_VIEWPORT_CLIP_HORIZ(i), 1));
+               BEGIN_RING(chan, eng3d, NV30_3D_VIEWPORT_CLIP_HORIZ(i), 1);
                OUT_RING(chan, 0);
-               OUT_RING(chan, RING_3D(NV30_3D_VIEWPORT_CLIP_VERT(i), 1));
+               BEGIN_RING(chan, eng3d, NV30_3D_VIEWPORT_CLIP_VERT(i), 1);
                OUT_RING(chan, 0);
        }
 
-       OUT_RING(chan, RING_3D(0x220, 1));
+       BEGIN_RING(chan, eng3d, 0x220, 1);
        OUT_RING(chan, 1);
 
-       OUT_RING(chan, RING_3D(0x03b0, 1));
+       BEGIN_RING(chan, eng3d, 0x03b0, 1);
        OUT_RING(chan, 0x00100000);
-       OUT_RING(chan, RING_3D(0x1454, 1));
+       BEGIN_RING(chan, eng3d, 0x1454, 1);
        OUT_RING(chan, 0);
-       OUT_RING(chan, RING_3D(0x1d80, 1));
+       BEGIN_RING(chan, eng3d, 0x1d80, 1);
        OUT_RING(chan, 3);
-       OUT_RING(chan, RING_3D(0x1450, 1));
+       BEGIN_RING(chan, eng3d, 0x1450, 1);
        OUT_RING(chan, 0x00030004);
 
        /* NEW */
-       OUT_RING(chan, RING_3D(0x1e98, 1));
+       BEGIN_RING(chan, eng3d, 0x1e98, 1);
        OUT_RING(chan, 0);
-       OUT_RING(chan, RING_3D(0x17e0, 3));
+       BEGIN_RING(chan, eng3d, 0x17e0, 3);
        OUT_RING(chan, fui(0.0));
        OUT_RING(chan, fui(0.0));
        OUT_RING(chan, fui(1.0));
-       OUT_RING(chan, RING_3D(0x1f80, 16));
+       BEGIN_RING(chan, eng3d, 0x1f80, 16);
        for (i=0; i<16; i++) {
                OUT_RING(chan, (i==8) ? 0x0000ffff : 0);
        }
 
-       OUT_RING(chan, RING_3D(0x120, 3));
+       BEGIN_RING(chan, eng3d, 0x120, 3);
        OUT_RING(chan, 0);
        OUT_RING(chan, 1);
        OUT_RING(chan, 2);
 
-       OUT_RING(chan, RING_3D(0x1d88, 1));
+       BEGIN_RING(chan, eng3d, 0x1d88, 1);
        OUT_RING(chan, 0x00001200);
 
-       OUT_RING(chan, RING_3D(NV30_3D_RC_ENABLE, 1));
+       BEGIN_RING(chan, eng3d, NV30_3D_RC_ENABLE, 1);
        OUT_RING(chan, 0);
 
-       OUT_RING(chan, RING_3D(NV30_3D_DEPTH_RANGE_NEAR, 2));
+       BEGIN_RING(chan, eng3d, NV30_3D_DEPTH_RANGE_NEAR, 2);
        OUT_RING(chan, fui(0.0));
        OUT_RING(chan, fui(1.0));
 
-       OUT_RING(chan, RING_3D(NV30_3D_MULTISAMPLE_CONTROL, 1));
+       BEGIN_RING(chan, eng3d, NV30_3D_MULTISAMPLE_CONTROL, 1);
        OUT_RING(chan, 0xffff0000);
 
        /* enables use of vp rather than fixed-function somehow */
-       OUT_RING(chan, RING_3D(0x1e94, 1));
+       BEGIN_RING(chan, eng3d, 0x1e94, 1);
        OUT_RING(chan, 0x13);
 }
 
 static void nv40_screen_init(struct nvfx_screen *screen)
 {
        struct nouveau_channel *chan = screen->base.channel;
+       struct nouveau_grobj *eng3d = screen->eng3d;
 
-       OUT_RING(chan, RING_3D(NV40_3D_DMA_COLOR2, 2));
+       BEGIN_RING(chan, eng3d, NV40_3D_DMA_COLOR2, 2);
        OUT_RING(chan, screen->base.channel->vram->handle);
        OUT_RING(chan, screen->base.channel->vram->handle);
 
-       OUT_RING(chan, RING_3D(0x1450, 1));
+       BEGIN_RING(chan, eng3d, 0x1450, 1);
        OUT_RING(chan, 0x00000004);
 
-       OUT_RING(chan, RING_3D(0x1ea4, 3));
+       BEGIN_RING(chan, eng3d, 0x1ea4, 3);
        OUT_RING(chan, 0x00000010);
        OUT_RING(chan, 0x01000100);
        OUT_RING(chan, 0xff800006);
 
        /* vtxprog output routing */
-       OUT_RING(chan, RING_3D(0x1fc4, 1));
+       BEGIN_RING(chan, eng3d, 0x1fc4, 1);
        OUT_RING(chan, 0x06144321);
-       OUT_RING(chan, RING_3D(0x1fc8, 2));
+       BEGIN_RING(chan, eng3d, 0x1fc8, 2);
        OUT_RING(chan, 0xedcba987);
        OUT_RING(chan, 0x0000006f);
-       OUT_RING(chan, RING_3D(0x1fd0, 1));
+       BEGIN_RING(chan, eng3d, 0x1fd0, 1);
        OUT_RING(chan, 0x00171615);
-       OUT_RING(chan, RING_3D(0x1fd4, 1));
+       BEGIN_RING(chan, eng3d, 0x1fd4, 1);
        OUT_RING(chan, 0x001b1a19);
 
-       OUT_RING(chan, RING_3D(0x1ef8, 1));
+       BEGIN_RING(chan, eng3d, 0x1ef8, 1);
        OUT_RING(chan, 0x0020ffff);
-       OUT_RING(chan, RING_3D(0x1d64, 1));
+       BEGIN_RING(chan, eng3d, 0x1d64, 1);
        OUT_RING(chan, 0x01d300d4);
-       OUT_RING(chan, RING_3D(0x1e94, 1));
+       BEGIN_RING(chan, eng3d, 0x1e94, 1);
        OUT_RING(chan, 0x00000001);
 
-       OUT_RING(chan, RING_3D(NV40_3D_MIPMAP_ROUNDING, 1));
+       BEGIN_RING(chan, eng3d, NV40_3D_MIPMAP_ROUNDING, 1);
        OUT_RING(chan, NV40_3D_MIPMAP_ROUNDING_MODE_DOWN);
 }
 
@@ -554,25 +581,25 @@ nvfx_screen_create(struct pipe_winsys *ws, struct nouveau_device *dev)
 
        /* Static eng3d initialisation */
        /* note that we just started using the channel, so we must have space in the pushbuffer */
-       OUT_RING(chan, RING_3D(NV30_3D_DMA_NOTIFY, 1));
+       BEGIN_RING(chan, screen->eng3d, NV30_3D_DMA_NOTIFY, 1);
        OUT_RING(chan, screen->sync->handle);
-       OUT_RING(chan, RING_3D(NV30_3D_DMA_TEXTURE0, 2));
+       BEGIN_RING(chan, screen->eng3d, NV30_3D_DMA_TEXTURE0, 2);
        OUT_RING(chan, chan->vram->handle);
        OUT_RING(chan, chan->gart->handle);
-       OUT_RING(chan, RING_3D(NV30_3D_DMA_COLOR1, 1));
+       BEGIN_RING(chan, screen->eng3d, NV30_3D_DMA_COLOR1, 1);
        OUT_RING(chan, chan->vram->handle);
-       OUT_RING(chan, RING_3D(NV30_3D_DMA_COLOR0, 2));
+       BEGIN_RING(chan, screen->eng3d, NV30_3D_DMA_COLOR0, 2);
        OUT_RING(chan, chan->vram->handle);
        OUT_RING(chan, chan->vram->handle);
-       OUT_RING(chan, RING_3D(NV30_3D_DMA_VTXBUF0, 2));
+       BEGIN_RING(chan, screen->eng3d, NV30_3D_DMA_VTXBUF0, 2);
        OUT_RING(chan, chan->vram->handle);
        OUT_RING(chan, chan->gart->handle);
 
-       OUT_RING(chan, RING_3D(NV30_3D_DMA_FENCE, 2));
+       BEGIN_RING(chan, screen->eng3d, NV30_3D_DMA_FENCE, 2);
        OUT_RING(chan, 0);
        OUT_RING(chan, screen->query->handle);
 
-       OUT_RING(chan, RING_3D(NV30_3D_DMA_UNK1AC, 2));
+       BEGIN_RING(chan, screen->eng3d, NV30_3D_DMA_UNK1AC, 2);
        OUT_RING(chan, chan->vram->handle);
        OUT_RING(chan, chan->vram->handle);