[PATCH 3/8] wined3d: Add hull shader type.

Józef Kucia jkucia at codeweavers.com
Tue Mar 29 05:14:53 CDT 2016


Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
---
 dlls/wined3d/arb_program_shader.c | 10 ++++++----
 dlls/wined3d/context.c            |  3 ++-
 dlls/wined3d/directx.c            |  1 +
 dlls/wined3d/glsl_shader.c        |  8 +++++++-
 dlls/wined3d/shader.c             | 19 ++++++++++++++++++-
 dlls/wined3d/utils.c              |  3 ++-
 dlls/wined3d/wined3d_main.c       |  3 +++
 dlls/wined3d/wined3d_private.h    | 12 ++++++++----
 8 files changed, 47 insertions(+), 12 deletions(-)

diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c
index 298107a..9ba280e 100644
--- a/dlls/wined3d/arb_program_shader.c
+++ b/dlls/wined3d/arb_program_shader.c
@@ -79,9 +79,9 @@ enum arb_helper_value
 
 static const char *arb_get_helper_value(enum wined3d_shader_type shader, enum arb_helper_value value)
 {
-    if (shader == WINED3D_SHADER_TYPE_GEOMETRY)
+    if (shader != WINED3D_SHADER_TYPE_VERTEX && shader != WINED3D_SHADER_TYPE_PIXEL)
     {
-        ERR("Geometry shaders are unsupported\n");
+        ERR("Unsupported shader type '%s'.\n.", debug_shader_type(shader));
         return "bad";
     }
 
@@ -109,7 +109,7 @@ static const char *arb_get_helper_value(enum wined3d_shader_type shader, enum ar
             case ARB_VS_REL_OFFSET: return "rel_addr_const.y";
         }
     }
-    FIXME("Unmanaged %s shader helper constant requested: %u\n",
+    FIXME("Unmanaged %s shader helper constant requested: %u.\n",
           shader == WINED3D_SHADER_TYPE_PIXEL ? "pixel" : "vertex", value);
     switch (value)
     {
@@ -4832,7 +4832,8 @@ static void shader_arb_disable(void *shader_priv, struct wined3d_context *contex
 
     context->shader_update_mask = (1u << WINED3D_SHADER_TYPE_PIXEL)
             | (1u << WINED3D_SHADER_TYPE_VERTEX)
-            | (1u << WINED3D_SHADER_TYPE_GEOMETRY);
+            | (1u << WINED3D_SHADER_TYPE_GEOMETRY)
+            | (1u << WINED3D_SHADER_TYPE_HULL);
 }
 
 /* Context activation is done by the caller. */
@@ -5120,6 +5121,7 @@ static void shader_arb_get_caps(const struct wined3d_gl_info *gl_info, struct sh
         caps->vs_uniform_count = 0;
     }
 
+    caps->hs_version = 0;
     caps->gs_version = 0;
 
     if (gl_info->supported[ARB_FRAGMENT_PROGRAM])
diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c
index 096cbac..8a7f13f 100644
--- a/dlls/wined3d/context.c
+++ b/dlls/wined3d/context.c
@@ -1950,7 +1950,8 @@ struct wined3d_context *context_create(struct wined3d_swapchain *swapchain,
     device->shader_backend->shader_init_context_state(ret);
     ret->shader_update_mask = (1u << WINED3D_SHADER_TYPE_PIXEL)
             | (1u << WINED3D_SHADER_TYPE_VERTEX)
-            | (1u << WINED3D_SHADER_TYPE_GEOMETRY);
+            | (1u << WINED3D_SHADER_TYPE_GEOMETRY)
+            | (1u << WINED3D_SHADER_TYPE_HULL);
 
     /* If this happens to be the first context for the device, dummy textures
      * are not created yet. In that case, they will be created (and bound) by
diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index f14eaaf..0cf38f2 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -3769,6 +3769,7 @@ static BOOL wined3d_adapter_init_gl_caps(struct wined3d_adapter *adapter, DWORD
     adapter->shader_backend->shader_get_caps(gl_info, &shader_caps);
     adapter->d3d_info.vs_clipping = shader_caps.wined3d_caps & WINED3D_SHADER_CAP_VS_CLIPPING;
     adapter->d3d_info.limits.vs_version = shader_caps.vs_version;
+    adapter->d3d_info.limits.hs_version = shader_caps.hs_version;
     adapter->d3d_info.limits.gs_version = shader_caps.gs_version;
     adapter->d3d_info.limits.ps_version = shader_caps.ps_version;
     adapter->d3d_info.limits.vs_uniform_count = shader_caps.vs_uniform_count;
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index 2dd7b29..22e89d9 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -270,6 +270,7 @@ static const char *debug_gl_shader_type(GLenum type)
     {
 #define WINED3D_TO_STR(u) case u: return #u
         WINED3D_TO_STR(GL_VERTEX_SHADER);
+        WINED3D_TO_STR(GL_TESS_CONTROL_SHADER);
         WINED3D_TO_STR(GL_GEOMETRY_SHADER);
         WINED3D_TO_STR(GL_FRAGMENT_SHADER);
 #undef WINED3D_TO_STR
@@ -285,6 +286,9 @@ static const char *shader_glsl_get_prefix(enum wined3d_shader_type type)
         case WINED3D_SHADER_TYPE_VERTEX:
             return "vs";
 
+        case WINED3D_SHADER_TYPE_HULL:
+            return "hs";
+
         case WINED3D_SHADER_TYPE_GEOMETRY:
             return "gs";
 
@@ -7652,7 +7656,8 @@ static void shader_glsl_invalidate_current_program(struct wined3d_context *conte
     ctx_data->glsl_program = NULL;
     context->shader_update_mask = (1u << WINED3D_SHADER_TYPE_PIXEL)
             | (1u << WINED3D_SHADER_TYPE_VERTEX)
-            | (1u << WINED3D_SHADER_TYPE_GEOMETRY);
+            | (1u << WINED3D_SHADER_TYPE_GEOMETRY)
+            | (1u << WINED3D_SHADER_TYPE_HULL);
 }
 
 /* Context activation is done by the caller. */
@@ -8050,6 +8055,7 @@ static void shader_glsl_get_caps(const struct wined3d_gl_info *gl_info, struct s
     TRACE("Shader model %u.\n", shader_model);
 
     caps->vs_version = min(wined3d_settings.max_sm_vs, shader_model);
+    caps->hs_version = min(wined3d_settings.max_sm_hs, shader_model);
     caps->gs_version = min(wined3d_settings.max_sm_gs, shader_model);
     caps->ps_version = min(wined3d_settings.max_sm_ps, shader_model);
 
diff --git a/dlls/wined3d/shader.c b/dlls/wined3d/shader.c
index 7120a7f..c0a7c78 100644
--- a/dlls/wined3d/shader.c
+++ b/dlls/wined3d/shader.c
@@ -499,6 +499,11 @@ static void shader_set_limits(struct wined3d_shader *shader)
         {WINED3D_SHADER_VERSION(5, 0), WINED3D_SHADER_VERSION(5, 0), {16,  0,   0,  0, 32,  0}},
         {0}
     },
+    hs_limits[] =
+    {
+        /* min_version, max_version, sampler, constant_int, constant_float, constant_bool, packed_output, packet_input */
+        {WINED3D_SHADER_VERSION(5, 0), WINED3D_SHADER_VERSION(5, 0), {16,  0,   0,  0, 32, 32}},
+    },
     gs_limits[] =
     {
         /* min_version, max_version, sampler, constant_int, constant_float, constant_bool, packed_output, packed_input */
@@ -530,6 +535,9 @@ static void shader_set_limits(struct wined3d_shader *shader)
         case WINED3D_SHADER_TYPE_VERTEX:
             limits_array = vs_limits;
             break;
+        case WINED3D_SHADER_TYPE_HULL:
+            limits_array = hs_limits;
+            break;
         case WINED3D_SHADER_TYPE_GEOMETRY:
             limits_array = gs_limits;
             break;
@@ -1934,6 +1942,10 @@ static void shader_trace_init(const struct wined3d_shader_frontend *fe, void *fe
             type_prefix = "vs";
             break;
 
+        case WINED3D_SHADER_TYPE_HULL:
+            type_prefix = "hs";
+            break;
+
         case WINED3D_SHADER_TYPE_GEOMETRY:
             type_prefix = "gs";
             break;
@@ -2209,7 +2221,8 @@ static void shader_none_disable(void *shader_priv, struct wined3d_context *conte
 
     context->shader_update_mask = (1u << WINED3D_SHADER_TYPE_PIXEL)
             | (1u << WINED3D_SHADER_TYPE_VERTEX)
-            | (1u << WINED3D_SHADER_TYPE_GEOMETRY);
+            | (1u << WINED3D_SHADER_TYPE_GEOMETRY)
+            | (1u << WINED3D_SHADER_TYPE_HULL);
 }
 
 static HRESULT shader_none_alloc(struct wined3d_device *device, const struct wined3d_vertex_pipe_ops *vertex_pipe,
@@ -2267,6 +2280,7 @@ static void shader_none_get_caps(const struct wined3d_gl_info *gl_info, struct s
 {
     /* Set the shader caps to 0 for the none shader backend */
     caps->vs_version = 0;
+    caps->hs_version = 0;
     caps->gs_version = 0;
     caps->ps_version = 0;
     caps->vs_uniform_count = 0;
@@ -2367,6 +2381,9 @@ static HRESULT shader_set_function(struct wined3d_shader *shader, const DWORD *b
         case WINED3D_SHADER_TYPE_VERTEX:
             backend_version = d3d_info->limits.vs_version;
             break;
+        case WINED3D_SHADER_TYPE_HULL:
+            backend_version = d3d_info->limits.hs_version;
+            break;
         case WINED3D_SHADER_TYPE_GEOMETRY:
             backend_version = d3d_info->limits.gs_version;
             break;
diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c
index e5a3ee6..efda6f2 100644
--- a/dlls/wined3d/utils.c
+++ b/dlls/wined3d/utils.c
@@ -3954,7 +3954,7 @@ const char *debug_d3dtstype(enum wined3d_transform_state tstype)
     }
 }
 
-static const char *debug_shader_type(enum wined3d_shader_type type)
+const char *debug_shader_type(enum wined3d_shader_type type)
 {
     switch(type)
     {
@@ -3962,6 +3962,7 @@ static const char *debug_shader_type(enum wined3d_shader_type type)
         WINED3D_TO_STR(WINED3D_SHADER_TYPE_PIXEL);
         WINED3D_TO_STR(WINED3D_SHADER_TYPE_VERTEX);
         WINED3D_TO_STR(WINED3D_SHADER_TYPE_GEOMETRY);
+        WINED3D_TO_STR(WINED3D_SHADER_TYPE_HULL);
 #undef WINED3D_TO_STR
         default:
             FIXME("Unrecognized shader type %#x.\n", type);
diff --git a/dlls/wined3d/wined3d_main.c b/dlls/wined3d/wined3d_main.c
index 71dc180..d584664 100644
--- a/dlls/wined3d/wined3d_main.c
+++ b/dlls/wined3d/wined3d_main.c
@@ -85,6 +85,7 @@ struct wined3d_settings wined3d_settings =
     TRUE,           /* Don't try to render onscreen by default. */
     FALSE,          /* Don't range check relative addressing indices in float constants. */
     ~0U,            /* No VS shader model limit by default. */
+    ~0U,            /* No HS shader model limit by default. */
     ~0U,            /* No GS shader model limit by default. */
     ~0U,            /* No PS shader model limit by default. */
     FALSE,          /* 3D support enabled by default. */
@@ -315,6 +316,8 @@ static BOOL wined3d_dll_init(HINSTANCE hInstDLL)
         }
         if (!get_config_key_dword(hkey, appkey, "MaxShaderModelVS", &wined3d_settings.max_sm_vs))
             TRACE("Limiting VS shader model to %u.\n", wined3d_settings.max_sm_vs);
+        if (!get_config_key_dword(hkey, appkey, "MaxShaderModelHS", &wined3d_settings.max_sm_hs))
+            TRACE("Limiting HS shader model to %u.\n", wined3d_settings.max_sm_hs);
         if (!get_config_key_dword(hkey, appkey, "MaxShaderModelGS", &wined3d_settings.max_sm_gs))
             TRACE("Limiting GS shader model to %u.\n", wined3d_settings.max_sm_gs);
         if (!get_config_key_dword(hkey, appkey, "MaxShaderModelPS", &wined3d_settings.max_sm_ps))
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 229f6fd..d37ea79 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -293,6 +293,7 @@ struct wined3d_settings
     BOOL always_offscreen;
     BOOL check_float_constants;
     unsigned int max_sm_vs;
+    unsigned int max_sm_hs;
     unsigned int max_sm_gs;
     unsigned int max_sm_ps;
     BOOL no_3d;
@@ -653,6 +654,7 @@ enum wined3d_shader_type
     WINED3D_SHADER_TYPE_PIXEL,
     WINED3D_SHADER_TYPE_VERTEX,
     WINED3D_SHADER_TYPE_GEOMETRY,
+    WINED3D_SHADER_TYPE_HULL,
     WINED3D_SHADER_TYPE_COUNT,
 };
 
@@ -887,9 +889,10 @@ typedef void (*SHADER_HANDLER)(const struct wined3d_shader_instruction *);
 
 struct shader_caps
 {
-    UINT vs_version;
-    UINT gs_version;
-    UINT ps_version;
+    unsigned int vs_version;
+    unsigned int hs_version;
+    unsigned int gs_version;
+    unsigned int ps_version;
 
     DWORD vs_uniform_count;
     DWORD ps_uniform_count;
@@ -1879,7 +1882,7 @@ struct wined3d_driver_info
 
 struct wined3d_d3d_limits
 {
-    UINT vs_version, gs_version, ps_version;
+    unsigned int vs_version, hs_version, gs_version, ps_version;
     DWORD vs_uniform_count;
     DWORD ps_uniform_count;
     UINT varying_count;
@@ -3030,6 +3033,7 @@ const char *debug_fboattachment(GLenum attachment) DECLSPEC_HIDDEN;
 const char *debug_fbostatus(GLenum status) DECLSPEC_HIDDEN;
 const char *debug_glerror(GLenum error) DECLSPEC_HIDDEN;
 const char *debug_d3dtop(enum wined3d_texture_op d3dtop) DECLSPEC_HIDDEN;
+const char *debug_shader_type(enum wined3d_shader_type shader_type) DECLSPEC_HIDDEN;
 void dump_color_fixup_desc(struct color_fixup_desc fixup) DECLSPEC_HIDDEN;
 
 BOOL is_invalid_op(const struct wined3d_state *state, int stage,
-- 
2.4.10




More information about the wine-patches mailing list