Module: Mesa
Branch: master
Commit: 4babdc78448f92b8d027a66cd506351a16aef4ec
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=4babdc78448f92b8d027a66cd506351a16aef4ec

Author: Luca Barbieri <[email protected]>
Date:   Thu Sep 23 18:03:34 2010 +0200

d3d1x: add untested support for geometry shader translation

---

 .../d3d1x/d3d1xstutil/include/d3d1xstutil.h        |    6 +++
 .../d3d1x/d3d1xstutil/src/d3d_sm4_enums.cpp        |   42 ++++++++++++++++++++
 .../state_trackers/d3d1x/gd3d1x/d3d1x_private.h    |    3 -
 .../state_trackers/d3d1x/gd3d1x/d3d_enums.cpp      |   24 -----------
 .../state_trackers/d3d1x/gd3d1x/sm4_to_tgsi.cpp    |   31 +++++++++++++--
 5 files changed, 75 insertions(+), 31 deletions(-)

diff --git a/src/gallium/state_trackers/d3d1x/d3d1xstutil/include/d3d1xstutil.h 
b/src/gallium/state_trackers/d3d1x/d3d1xstutil/include/d3d1xstutil.h
index 313aa10..2b613b8 100644
--- a/src/gallium/state_trackers/d3d1x/d3d1xstutil/include/d3d1xstutil.h
+++ b/src/gallium/state_trackers/d3d1x/d3d1xstutil/include/d3d1xstutil.h
@@ -62,6 +62,12 @@ extern "C"
 #undef max
 #endif
 
+#define D3D_PRIMITIVE_TOPOLOGY_COUNT 65
+extern unsigned d3d_to_pipe_prim[D3D_PRIMITIVE_TOPOLOGY_COUNT];
+
+#define D3D_PRIMITIVE_COUNT 40
+extern unsigned d3d_to_pipe_prim_type[D3D_PRIMITIVE_COUNT];
+
 /* NOTE: this _depends_ on the vtable layout of the C++ compiler to be
  * binary compatible with Windows.
  * Furthermore some absurd vtable layout likely won't work at all, since
diff --git a/src/gallium/state_trackers/d3d1x/d3d1xstutil/src/d3d_sm4_enums.cpp 
b/src/gallium/state_trackers/d3d1x/d3d1xstutil/src/d3d_sm4_enums.cpp
new file mode 100644
index 0000000..410a56c
--- /dev/null
+++ b/src/gallium/state_trackers/d3d1x/d3d1xstutil/src/d3d_sm4_enums.cpp
@@ -0,0 +1,42 @@
+#include "d3d1xstutil.h"
+
+unsigned d3d_to_pipe_prim[D3D_PRIMITIVE_TOPOLOGY_COUNT] =
+{
+       0,
+       PIPE_PRIM_POINTS,
+       PIPE_PRIM_LINES,
+       PIPE_PRIM_LINE_STRIP,
+       PIPE_PRIM_TRIANGLES,
+       PIPE_PRIM_TRIANGLE_STRIP,
+       PIPE_PRIM_LINES_ADJACENCY,
+       PIPE_PRIM_LINE_STRIP_ADJACENCY,
+       PIPE_PRIM_TRIANGLES_ADJACENCY,
+       PIPE_PRIM_TRIANGLE_STRIP_ADJACENCY,
+       /* gap */
+       0, 0, 0, 0, 0, 0,
+       0, 0, 0, 0, 0, 0, 0, 0,
+       0, 0, 0, 0, 0, 0, 0, 0,
+       0,
+       /* patches */
+       0, 0, 0, 0, 0, 0, 0, 0,
+       0, 0, 0, 0, 0, 0, 0, 0,
+       0, 0, 0, 0, 0, 0, 0, 0,
+       0, 0, 0, 0, 0, 0, 0, 0,
+};
+
+unsigned d3d_to_pipe_prim_type[D3D_PRIMITIVE_COUNT] =
+{
+       0,
+       PIPE_PRIM_POINTS,
+       PIPE_PRIM_LINES,
+       PIPE_PRIM_TRIANGLES,
+       0,
+       PIPE_PRIM_POINTS,
+       PIPE_PRIM_LINES_ADJACENCY,
+       PIPE_PRIM_TRIANGLES_ADJACENCY,
+       /* patches */
+       0, 0, 0, 0, 0, 0, 0, 0,
+       0, 0, 0, 0, 0, 0, 0, 0,
+       0, 0, 0, 0, 0, 0, 0, 0,
+       0, 0, 0, 0, 0, 0, 0, 0,
+};
diff --git a/src/gallium/state_trackers/d3d1x/gd3d1x/d3d1x_private.h 
b/src/gallium/state_trackers/d3d1x/gd3d1x/d3d1x_private.h
index d4b6a8f..977f0cd 100644
--- a/src/gallium/state_trackers/d3d1x/gd3d1x/d3d1x_private.h
+++ b/src/gallium/state_trackers/d3d1x/gd3d1x/d3d1x_private.h
@@ -92,7 +92,4 @@ extern unsigned 
d3d11_to_pipe_wrap[D3D11_TEXTURE_ADDRESS_COUNT];
 extern unsigned d3d11_to_pipe_query[D3D11_QUERY_COUNT];
 extern unsigned d3d11_query_size[D3D11_QUERY_COUNT];
 
-#define D3D_PRIMITIVE_TOPOLOGY_COUNT 65
-extern unsigned d3d_to_pipe_prim[D3D_PRIMITIVE_TOPOLOGY_COUNT];
-
 #endif /* D3D1X_H_ */
diff --git a/src/gallium/state_trackers/d3d1x/gd3d1x/d3d_enums.cpp 
b/src/gallium/state_trackers/d3d1x/gd3d1x/d3d_enums.cpp
index 37113a6..853d114 100644
--- a/src/gallium/state_trackers/d3d1x/gd3d1x/d3d_enums.cpp
+++ b/src/gallium/state_trackers/d3d1x/gd3d1x/d3d_enums.cpp
@@ -121,27 +121,3 @@ unsigned d3d11_query_size[D3D11_QUERY_COUNT] =
                0,
                0
 };
-
-unsigned d3d_to_pipe_prim[D3D_PRIMITIVE_TOPOLOGY_COUNT] =
-{
-       0,
-       PIPE_PRIM_POINTS,
-       PIPE_PRIM_LINES,
-       PIPE_PRIM_LINE_STRIP,
-       PIPE_PRIM_TRIANGLES,
-       PIPE_PRIM_TRIANGLE_STRIP,
-       PIPE_PRIM_LINES_ADJACENCY,
-       PIPE_PRIM_LINE_STRIP_ADJACENCY,
-       PIPE_PRIM_TRIANGLES_ADJACENCY,
-       PIPE_PRIM_TRIANGLE_STRIP_ADJACENCY,
-       /* gap */
-       0, 0, 0, 0, 0, 0,
-       0, 0, 0, 0, 0, 0, 0, 0,
-       0, 0, 0, 0, 0, 0, 0, 0,
-       0,
-       /* patches */
-       0, 0, 0, 0, 0, 0, 0, 0,
-       0, 0, 0, 0, 0, 0, 0, 0,
-       0, 0, 0, 0, 0, 0, 0, 0,
-       0, 0, 0, 0, 0, 0, 0, 0,
-};
diff --git a/src/gallium/state_trackers/d3d1x/gd3d1x/sm4_to_tgsi.cpp 
b/src/gallium/state_trackers/d3d1x/gd3d1x/sm4_to_tgsi.cpp
index 4b43a33..7d03cec 100644
--- a/src/gallium/state_trackers/d3d1x/gd3d1x/sm4_to_tgsi.cpp
+++ b/src/gallium/state_trackers/d3d1x/gd3d1x/sm4_to_tgsi.cpp
@@ -24,6 +24,7 @@
  *
  **************************************************************************/
 
+#include "d3d1xstutil.h"
 #include "sm4.h"
 #include "tgsi/tgsi_ureg.h"
 #include <vector>
@@ -137,9 +138,16 @@ struct sm4_to_tgsi_converter
                        s = ureg_imm4f(ureg, op.imm_values[0].f32, 
op.imm_values[1].f32, op.imm_values[2].f32, op.imm_values[3].f32);
                        break;
                case SM4_FILE_INPUT:
-                       check(op.has_simple_index());
-                       check(op.indices[0].disp < inputs.size());
-                       s = inputs[op.indices[0].disp];
+                       check(op.is_index_simple(0));
+                       check(op.num_indices == 1 || op.num_indices == 2);
+                       // TODO: is this correct, or are incorrectly swapping 
the two indices in the GS case?
+                       check(op.indices[op.num_indices - 1].disp < 
inputs.size());
+                       s = inputs[op.indices[op.num_indices - 1].disp];
+                       if(op.num_indices == 2)
+                       {
+                               s.Dimension = 1;
+                               s.DimensionIndex = op.indices[0].disp;
+                       }
                        break;
                case SM4_FILE_CONSTANT_BUFFER:
                        // TODO: indirect addressing
@@ -700,7 +708,7 @@ next:;
                {
                        sm4_dcl& dcl = *program.dcls[insn_num];
                        int idx = -1;
-                       if(dcl.op.get() && dcl.op->has_simple_index())
+                       if(dcl.op.get() && dcl.op->is_index_simple(0))
                                idx = dcl.op->indices[0].disp;
                        switch(dcl.opcode)
                        {
@@ -716,6 +724,12 @@ next:;
                                        inputs.resize(idx + 1);
                                if(processor == TGSI_PROCESSOR_VERTEX)
                                        inputs[idx] = ureg_DECL_vs_input(ureg, 
idx);
+                               else if(processor == TGSI_PROCESSOR_GEOMETRY)
+                               {
+                                       // TODO: is this correct?
+                                       unsigned gsidx = 
dcl.op->indices[1].disp;
+                                       inputs[gsidx] = 
ureg_DECL_gs_input(ureg, gsidx, TGSI_SEMANTIC_GENERIC, gsidx);
+                               }
                                else
                                        check(0);
                                break;
@@ -792,6 +806,15 @@ next:;
                                idx = dcl.op->indices[0].disp;
                                ureg_DECL_constant2D(ureg, 0, 
(unsigned)dcl.op->indices[1].disp - 1, idx);
                                break;
+                       case SM4_OPCODE_DCL_GS_INPUT_PRIMITIVE:
+                               ureg_property_gs_input_prim(ureg, 
d3d_to_pipe_prim_type[dcl.dcl_gs_input_primitive.primitive]);
+                               break;
+                       case SM4_OPCODE_DCL_GS_OUTPUT_PRIMITIVE_TOPOLOGY:
+                               ureg_property_gs_output_prim(ureg, 
d3d_to_pipe_prim[dcl.dcl_gs_output_primitive_topology.primitive_topology]);
+                               break;
+                       case SM4_OPCODE_DCL_MAX_OUTPUT_VERTEX_COUNT:
+                               ureg_property_gs_max_vertices(ureg, dcl.num);
+                               break;
                        default:
                                check(0);
                        }

_______________________________________________
mesa-commit mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to