[Mesa-dev] [PATCH v2 1/3] nvc0: implement multiple viewports/scissors, enable ARB_viewport_array

2014-06-15 Thread Tobias Klausmann
Signed-off-by: Tobias Klausmann tobias.johannes.klausm...@mni.thm.de
---
 src/gallium/drivers/nouveau/nvc0/nvc0_context.h|   7 +-
 src/gallium/drivers/nouveau/nvc0/nvc0_program.c|   2 +-
 src/gallium/drivers/nouveau/nvc0/nvc0_screen.c |  20 ++--
 src/gallium/drivers/nouveau/nvc0/nvc0_screen.h |   3 +
 src/gallium/drivers/nouveau/nvc0/nvc0_state.c  |  27 +++--
 .../drivers/nouveau/nvc0/nvc0_state_validate.c | 116 +
 6 files changed, 112 insertions(+), 63 deletions(-)

diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_context.h 
b/src/gallium/drivers/nouveau/nvc0/nvc0_context.h
index 76416a0..674dd3c 100644
--- a/src/gallium/drivers/nouveau/nvc0/nvc0_context.h
+++ b/src/gallium/drivers/nouveau/nvc0/nvc0_context.h
@@ -178,8 +178,11 @@ struct nvc0_context {
struct pipe_blend_color blend_colour;
struct pipe_stencil_ref stencil_ref;
struct pipe_poly_stipple stipple;
-   struct pipe_scissor_state scissor;
-   struct pipe_viewport_state viewport;
+
+   struct pipe_scissor_state scissors[NVC0_MAX_VIEWPORTS];
+   unsigned scissors_dirty;
+   struct pipe_viewport_state viewports[NVC0_MAX_VIEWPORTS];
+   unsigned viewports_dirty;
struct pipe_clip_state clip;
 
unsigned sample_mask;
diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_program.c 
b/src/gallium/drivers/nouveau/nvc0/nvc0_program.c
index 1c82a9a..667fbc8 100644
--- a/src/gallium/drivers/nouveau/nvc0/nvc0_program.c
+++ b/src/gallium/drivers/nouveau/nvc0/nvc0_program.c
@@ -64,7 +64,7 @@ nvc0_shader_output_address(unsigned sn, unsigned si, unsigned 
ubase)
case NV50_SEMANTIC_TESSFACTOR:return 0x000 + si * 0x4;
case TGSI_SEMANTIC_PRIMID:return 0x060;
case TGSI_SEMANTIC_LAYER: return 0x064;
-   case NV50_SEMANTIC_VIEWPORTINDEX: return 0x068;
+   case TGSI_SEMANTIC_VIEWPORT_INDEX:return 0x068;
case TGSI_SEMANTIC_PSIZE: return 0x06c;
case TGSI_SEMANTIC_POSITION:  return 0x070;
case TGSI_SEMANTIC_GENERIC:   return ubase + si * 0x10;
diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c 
b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
index 3e6b011..3fdb6ae 100644
--- a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
+++ b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
@@ -183,7 +183,7 @@ nvc0_screen_get_param(struct pipe_screen *pscreen, enum 
pipe_cap param)
case PIPE_CAP_FAKE_SW_MSAA:
   return 0;
case PIPE_CAP_MAX_VIEWPORTS:
-  return 1;
+  return NVC0_MAX_VIEWPORTS;
case PIPE_CAP_TEXTURE_QUERY_LOD:
case PIPE_CAP_SAMPLE_SHADING:
case PIPE_CAP_TEXTURE_GATHER_OFFSETS:
@@ -933,19 +933,23 @@ nvc0_screen_create(struct nouveau_device *dev)
 
BEGIN_NVC0(push, NVC0_3D(VIEWPORT_TRANSFORM_EN), 1);
PUSH_DATA (push, 1);
-   BEGIN_NVC0(push, NVC0_3D(DEPTH_RANGE_NEAR(0)), 2);
-   PUSH_DATAf(push, 0.0f);
-   PUSH_DATAf(push, 1.0f);
+   for (i = 0; i  NVC0_MAX_VIEWPORTS; i++) {
+  BEGIN_NVC0(push, NVC0_3D(DEPTH_RANGE_NEAR(i)), 2);
+  PUSH_DATAf(push, 0.0f);
+  PUSH_DATAf(push, 1.0f);
+   }
BEGIN_NVC0(push, NVC0_3D(VIEW_VOLUME_CLIP_CTRL), 1);
PUSH_DATA (push, NVC0_3D_VIEW_VOLUME_CLIP_CTRL_UNK1_UNK1);
 
/* We use scissors instead of exact view volume clipping,
 * so they're always enabled.
 */
-   BEGIN_NVC0(push, NVC0_3D(SCISSOR_ENABLE(0)), 3);
-   PUSH_DATA (push, 1);
-   PUSH_DATA (push, 8192  16);
-   PUSH_DATA (push, 8192  16);
+   for (i = 0; i  NVC0_MAX_VIEWPORTS; i++) {
+  BEGIN_NVC0(push, NVC0_3D(SCISSOR_ENABLE(i)), 3);
+  PUSH_DATA (push, 1);
+  PUSH_DATA (push, 8192  16);
+  PUSH_DATA (push, 8192  16);
+   }
 
 #define MK_MACRO(m, n) i = nvc0_graph_set_macro(screen, m, i, sizeof(n), n);
 
diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.h 
b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.h
index c58add5..4802057 100644
--- a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.h
+++ b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.h
@@ -20,6 +20,9 @@
 
 #define NVC0_MAX_SURFACE_SLOTS 16
 
+#define NVC0_MAX_VIEWPORTS 16
+
+
 struct nvc0_context;
 
 struct nvc0_blitter;
diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_state.c 
b/src/gallium/drivers/nouveau/nvc0/nvc0_state.c
index 27e5cd8..c92aaac 100644
--- a/src/gallium/drivers/nouveau/nvc0/nvc0_state.c
+++ b/src/gallium/drivers/nouveau/nvc0/nvc0_state.c
@@ -909,10 +909,17 @@ nvc0_set_scissor_states(struct pipe_context *pipe,
 unsigned num_scissors,
 const struct pipe_scissor_state *scissor)
 {
-struct nvc0_context *nvc0 = nvc0_context(pipe);
+   struct nvc0_context *nvc0 = nvc0_context(pipe);
+   int i;
 
-nvc0-scissor = *scissor;
-nvc0-dirty |= NVC0_NEW_SCISSOR;
+   assert(start_slot + num_scissors = NVC0_MAX_VIEWPORTS);
+   for (i = 0; i  num_scissors; i++) {
+  if (!memcmp(nvc0-scissors[start_slot + i], scissor[i], 
sizeof(*scissor)))
+ continue;
+  nvc0-scissors[start_slot + i] = scissor[i];
+  nvc0-scissors_dirty |= 1  

Re: [Mesa-dev] [PATCH v2 1/3] nvc0: implement multiple viewports/scissors, enable ARB_viewport_array

2014-06-15 Thread Ilia Mirkin
I've made a few small fixes to this -- you forget to set the
scissors/viewports dirty to ~0 on context switch, and also marking the
first scissor dirty after a 3d blit (which I was forgetting to do on
nv50 as well... oops). I'll push this out shortly with my
modifications.

Thanks for the contribution!

  -ilia

On Sun, Jun 15, 2014 at 3:24 PM, Tobias Klausmann
tobias.johannes.klausm...@mni.thm.de wrote:
 Signed-off-by: Tobias Klausmann tobias.johannes.klausm...@mni.thm.de
 ---
  src/gallium/drivers/nouveau/nvc0/nvc0_context.h|   7 +-
  src/gallium/drivers/nouveau/nvc0/nvc0_program.c|   2 +-
  src/gallium/drivers/nouveau/nvc0/nvc0_screen.c |  20 ++--
  src/gallium/drivers/nouveau/nvc0/nvc0_screen.h |   3 +
  src/gallium/drivers/nouveau/nvc0/nvc0_state.c  |  27 +++--
  .../drivers/nouveau/nvc0/nvc0_state_validate.c | 116 
 +
  6 files changed, 112 insertions(+), 63 deletions(-)

 diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_context.h 
 b/src/gallium/drivers/nouveau/nvc0/nvc0_context.h
 index 76416a0..674dd3c 100644
 --- a/src/gallium/drivers/nouveau/nvc0/nvc0_context.h
 +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_context.h
 @@ -178,8 +178,11 @@ struct nvc0_context {
 struct pipe_blend_color blend_colour;
 struct pipe_stencil_ref stencil_ref;
 struct pipe_poly_stipple stipple;
 -   struct pipe_scissor_state scissor;
 -   struct pipe_viewport_state viewport;
 +
 +   struct pipe_scissor_state scissors[NVC0_MAX_VIEWPORTS];
 +   unsigned scissors_dirty;
 +   struct pipe_viewport_state viewports[NVC0_MAX_VIEWPORTS];
 +   unsigned viewports_dirty;
 struct pipe_clip_state clip;

 unsigned sample_mask;
 diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_program.c 
 b/src/gallium/drivers/nouveau/nvc0/nvc0_program.c
 index 1c82a9a..667fbc8 100644
 --- a/src/gallium/drivers/nouveau/nvc0/nvc0_program.c
 +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_program.c
 @@ -64,7 +64,7 @@ nvc0_shader_output_address(unsigned sn, unsigned si, 
 unsigned ubase)
 case NV50_SEMANTIC_TESSFACTOR:return 0x000 + si * 0x4;
 case TGSI_SEMANTIC_PRIMID:return 0x060;
 case TGSI_SEMANTIC_LAYER: return 0x064;
 -   case NV50_SEMANTIC_VIEWPORTINDEX: return 0x068;
 +   case TGSI_SEMANTIC_VIEWPORT_INDEX:return 0x068;
 case TGSI_SEMANTIC_PSIZE: return 0x06c;
 case TGSI_SEMANTIC_POSITION:  return 0x070;
 case TGSI_SEMANTIC_GENERIC:   return ubase + si * 0x10;
 diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c 
 b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
 index 3e6b011..3fdb6ae 100644
 --- a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
 +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
 @@ -183,7 +183,7 @@ nvc0_screen_get_param(struct pipe_screen *pscreen, enum 
 pipe_cap param)
 case PIPE_CAP_FAKE_SW_MSAA:
return 0;
 case PIPE_CAP_MAX_VIEWPORTS:
 -  return 1;
 +  return NVC0_MAX_VIEWPORTS;
 case PIPE_CAP_TEXTURE_QUERY_LOD:
 case PIPE_CAP_SAMPLE_SHADING:
 case PIPE_CAP_TEXTURE_GATHER_OFFSETS:
 @@ -933,19 +933,23 @@ nvc0_screen_create(struct nouveau_device *dev)

 BEGIN_NVC0(push, NVC0_3D(VIEWPORT_TRANSFORM_EN), 1);
 PUSH_DATA (push, 1);
 -   BEGIN_NVC0(push, NVC0_3D(DEPTH_RANGE_NEAR(0)), 2);
 -   PUSH_DATAf(push, 0.0f);
 -   PUSH_DATAf(push, 1.0f);
 +   for (i = 0; i  NVC0_MAX_VIEWPORTS; i++) {
 +  BEGIN_NVC0(push, NVC0_3D(DEPTH_RANGE_NEAR(i)), 2);
 +  PUSH_DATAf(push, 0.0f);
 +  PUSH_DATAf(push, 1.0f);
 +   }
 BEGIN_NVC0(push, NVC0_3D(VIEW_VOLUME_CLIP_CTRL), 1);
 PUSH_DATA (push, NVC0_3D_VIEW_VOLUME_CLIP_CTRL_UNK1_UNK1);

 /* We use scissors instead of exact view volume clipping,
  * so they're always enabled.
  */
 -   BEGIN_NVC0(push, NVC0_3D(SCISSOR_ENABLE(0)), 3);
 -   PUSH_DATA (push, 1);
 -   PUSH_DATA (push, 8192  16);
 -   PUSH_DATA (push, 8192  16);
 +   for (i = 0; i  NVC0_MAX_VIEWPORTS; i++) {
 +  BEGIN_NVC0(push, NVC0_3D(SCISSOR_ENABLE(i)), 3);
 +  PUSH_DATA (push, 1);
 +  PUSH_DATA (push, 8192  16);
 +  PUSH_DATA (push, 8192  16);
 +   }

  #define MK_MACRO(m, n) i = nvc0_graph_set_macro(screen, m, i, sizeof(n), n);

 diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.h 
 b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.h
 index c58add5..4802057 100644
 --- a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.h
 +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.h
 @@ -20,6 +20,9 @@

  #define NVC0_MAX_SURFACE_SLOTS 16

 +#define NVC0_MAX_VIEWPORTS 16
 +
 +
  struct nvc0_context;

  struct nvc0_blitter;
 diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_state.c 
 b/src/gallium/drivers/nouveau/nvc0/nvc0_state.c
 index 27e5cd8..c92aaac 100644
 --- a/src/gallium/drivers/nouveau/nvc0/nvc0_state.c
 +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_state.c
 @@ -909,10 +909,17 @@ nvc0_set_scissor_states(struct pipe_context *pipe,
  unsigned num_scissors,
  const struct