wined3d: Add hull shader type.

Signed-off-by: Józef Kucia <jkucia@codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Józef Kucia 2016-03-29 12:14:53 +02:00 committed by Alexandre Julliard
parent 210b78258f
commit 403459fd91
8 changed files with 47 additions and 12 deletions

View File

@ -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])

View File

@ -1952,7 +1952,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

View File

@ -3774,6 +3774,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;

View File

@ -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);

View File

@ -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;

View File

@ -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);

View File

@ -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))

View File

@ -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;
@ -3039,6 +3042,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,