Commit b30f59c5 authored by Józef Kucia's avatar Józef Kucia Committed by Alexandre Julliard

wined3d: Add compute shader type.

parent 03ed7f48
...@@ -4842,7 +4842,8 @@ static void shader_arb_disable(void *shader_priv, struct wined3d_context *contex ...@@ -4842,7 +4842,8 @@ static void shader_arb_disable(void *shader_priv, struct wined3d_context *contex
| (1u << WINED3D_SHADER_TYPE_VERTEX) | (1u << WINED3D_SHADER_TYPE_VERTEX)
| (1u << WINED3D_SHADER_TYPE_GEOMETRY) | (1u << WINED3D_SHADER_TYPE_GEOMETRY)
| (1u << WINED3D_SHADER_TYPE_HULL) | (1u << WINED3D_SHADER_TYPE_HULL)
| (1u << WINED3D_SHADER_TYPE_DOMAIN); | (1u << WINED3D_SHADER_TYPE_DOMAIN)
| (1u << WINED3D_SHADER_TYPE_COMPUTE);
} }
/* Context activation is done by the caller. */ /* Context activation is done by the caller. */
...@@ -5117,6 +5118,7 @@ static void shader_arb_get_caps(const struct wined3d_gl_info *gl_info, struct sh ...@@ -5117,6 +5118,7 @@ static void shader_arb_get_caps(const struct wined3d_gl_info *gl_info, struct sh
caps->hs_version = 0; caps->hs_version = 0;
caps->ds_version = 0; caps->ds_version = 0;
caps->gs_version = 0; caps->gs_version = 0;
caps->cs_version = 0;
if (gl_info->supported[ARB_FRAGMENT_PROGRAM]) if (gl_info->supported[ARB_FRAGMENT_PROGRAM])
{ {
......
...@@ -1987,7 +1987,8 @@ struct wined3d_context *context_create(struct wined3d_swapchain *swapchain, ...@@ -1987,7 +1987,8 @@ struct wined3d_context *context_create(struct wined3d_swapchain *swapchain,
| (1u << WINED3D_SHADER_TYPE_VERTEX) | (1u << WINED3D_SHADER_TYPE_VERTEX)
| (1u << WINED3D_SHADER_TYPE_GEOMETRY) | (1u << WINED3D_SHADER_TYPE_GEOMETRY)
| (1u << WINED3D_SHADER_TYPE_HULL) | (1u << WINED3D_SHADER_TYPE_HULL)
| (1u << WINED3D_SHADER_TYPE_DOMAIN); | (1u << WINED3D_SHADER_TYPE_DOMAIN)
| (1u << WINED3D_SHADER_TYPE_COMPUTE);
/* If this happens to be the first context for the device, dummy textures /* 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 * are not created yet. In that case, they will be created (and bound) by
......
...@@ -3839,6 +3839,7 @@ static BOOL wined3d_adapter_init_gl_caps(struct wined3d_adapter *adapter, DWORD ...@@ -3839,6 +3839,7 @@ static BOOL wined3d_adapter_init_gl_caps(struct wined3d_adapter *adapter, DWORD
adapter->d3d_info.limits.ds_version = shader_caps.ds_version; adapter->d3d_info.limits.ds_version = shader_caps.ds_version;
adapter->d3d_info.limits.gs_version = shader_caps.gs_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.ps_version = shader_caps.ps_version;
adapter->d3d_info.limits.cs_version = shader_caps.cs_version;
adapter->d3d_info.limits.vs_uniform_count = shader_caps.vs_uniform_count; adapter->d3d_info.limits.vs_uniform_count = shader_caps.vs_uniform_count;
adapter->d3d_info.limits.ps_uniform_count = shader_caps.ps_uniform_count; adapter->d3d_info.limits.ps_uniform_count = shader_caps.ps_uniform_count;
adapter->d3d_info.limits.varying_count = shader_caps.varying_count; adapter->d3d_info.limits.varying_count = shader_caps.varying_count;
......
...@@ -279,6 +279,7 @@ static const char *debug_gl_shader_type(GLenum type) ...@@ -279,6 +279,7 @@ static const char *debug_gl_shader_type(GLenum type)
WINED3D_TO_STR(GL_TESS_EVALUATION_SHADER); WINED3D_TO_STR(GL_TESS_EVALUATION_SHADER);
WINED3D_TO_STR(GL_GEOMETRY_SHADER); WINED3D_TO_STR(GL_GEOMETRY_SHADER);
WINED3D_TO_STR(GL_FRAGMENT_SHADER); WINED3D_TO_STR(GL_FRAGMENT_SHADER);
WINED3D_TO_STR(GL_COMPUTE_SHADER);
#undef WINED3D_TO_STR #undef WINED3D_TO_STR
default: default:
return wine_dbg_sprintf("UNKNOWN(%#x)", type); return wine_dbg_sprintf("UNKNOWN(%#x)", type);
...@@ -304,6 +305,9 @@ static const char *shader_glsl_get_prefix(enum wined3d_shader_type type) ...@@ -304,6 +305,9 @@ static const char *shader_glsl_get_prefix(enum wined3d_shader_type type)
case WINED3D_SHADER_TYPE_PIXEL: case WINED3D_SHADER_TYPE_PIXEL:
return "ps"; return "ps";
case WINED3D_SHADER_TYPE_COMPUTE:
return "cs";
default: default:
FIXME("Unhandled shader type %#x.\n", type); FIXME("Unhandled shader type %#x.\n", type);
return "unknown"; return "unknown";
...@@ -8092,7 +8096,8 @@ static void shader_glsl_invalidate_current_program(struct wined3d_context *conte ...@@ -8092,7 +8096,8 @@ static void shader_glsl_invalidate_current_program(struct wined3d_context *conte
| (1u << WINED3D_SHADER_TYPE_VERTEX) | (1u << WINED3D_SHADER_TYPE_VERTEX)
| (1u << WINED3D_SHADER_TYPE_GEOMETRY) | (1u << WINED3D_SHADER_TYPE_GEOMETRY)
| (1u << WINED3D_SHADER_TYPE_HULL) | (1u << WINED3D_SHADER_TYPE_HULL)
| (1u << WINED3D_SHADER_TYPE_DOMAIN); | (1u << WINED3D_SHADER_TYPE_DOMAIN)
| (1u << WINED3D_SHADER_TYPE_COMPUTE);
} }
/* Context activation is done by the caller. */ /* Context activation is done by the caller. */
...@@ -8492,6 +8497,7 @@ static void shader_glsl_get_caps(const struct wined3d_gl_info *gl_info, struct s ...@@ -8492,6 +8497,7 @@ static void shader_glsl_get_caps(const struct wined3d_gl_info *gl_info, struct s
caps->ds_version = min(wined3d_settings.max_sm_ds, shader_model); caps->ds_version = min(wined3d_settings.max_sm_ds, shader_model);
caps->gs_version = min(wined3d_settings.max_sm_gs, shader_model); caps->gs_version = min(wined3d_settings.max_sm_gs, shader_model);
caps->ps_version = min(wined3d_settings.max_sm_ps, shader_model); caps->ps_version = min(wined3d_settings.max_sm_ps, shader_model);
caps->cs_version = min(wined3d_settings.max_sm_cs, shader_model);
caps->vs_uniform_count = min(WINED3D_MAX_VS_CONSTS_F, gl_info->limits.glsl_vs_float_constants); caps->vs_uniform_count = min(WINED3D_MAX_VS_CONSTS_F, gl_info->limits.glsl_vs_float_constants);
caps->ps_uniform_count = min(WINED3D_MAX_PS_CONSTS_F, gl_info->limits.glsl_ps_float_constants); caps->ps_uniform_count = min(WINED3D_MAX_PS_CONSTS_F, gl_info->limits.glsl_ps_float_constants);
......
...@@ -582,6 +582,11 @@ static void shader_set_limits(struct wined3d_shader *shader) ...@@ -582,6 +582,11 @@ static void shader_set_limits(struct wined3d_shader *shader)
{WINED3D_SHADER_VERSION(3, 0), WINED3D_SHADER_VERSION(3, 0), {16, 16, 224, 16, 0, 12}}, {WINED3D_SHADER_VERSION(3, 0), WINED3D_SHADER_VERSION(3, 0), {16, 16, 224, 16, 0, 12}},
{WINED3D_SHADER_VERSION(4, 0), WINED3D_SHADER_VERSION(5, 0), {16, 0, 0, 0, 0, 32}}, {WINED3D_SHADER_VERSION(4, 0), WINED3D_SHADER_VERSION(5, 0), {16, 0, 0, 0, 0, 32}},
{0} {0}
},
cs_limits[] =
{
/* min_version, max_version, sampler, constant_int, constant_float, constant_bool, packed_output, packed_input */
{WINED3D_SHADER_VERSION(5, 0), WINED3D_SHADER_VERSION(5, 0), {16, 0, 0, 0, 0, 0}},
}; };
const struct limits_entry *limits_array; const struct limits_entry *limits_array;
DWORD shader_version = WINED3D_SHADER_VERSION(shader->reg_maps.shader_version.major, DWORD shader_version = WINED3D_SHADER_VERSION(shader->reg_maps.shader_version.major,
...@@ -608,6 +613,9 @@ static void shader_set_limits(struct wined3d_shader *shader) ...@@ -608,6 +613,9 @@ static void shader_set_limits(struct wined3d_shader *shader)
case WINED3D_SHADER_TYPE_PIXEL: case WINED3D_SHADER_TYPE_PIXEL:
limits_array = ps_limits; limits_array = ps_limits;
break; break;
case WINED3D_SHADER_TYPE_COMPUTE:
limits_array = cs_limits;
break;
} }
while (limits_array[i].min_version && limits_array[i].min_version <= shader_version) while (limits_array[i].min_version && limits_array[i].min_version <= shader_version)
...@@ -2111,6 +2119,10 @@ static void shader_trace_init(const struct wined3d_shader_frontend *fe, void *fe ...@@ -2111,6 +2119,10 @@ static void shader_trace_init(const struct wined3d_shader_frontend *fe, void *fe
type_prefix = "ps"; type_prefix = "ps";
break; break;
case WINED3D_SHADER_TYPE_COMPUTE:
type_prefix = "cs";
break;
default: default:
FIXME("Unhandled shader type %#x.\n", shader_version.type); FIXME("Unhandled shader type %#x.\n", shader_version.type);
type_prefix = "unknown"; type_prefix = "unknown";
...@@ -2413,7 +2425,8 @@ static void shader_none_disable(void *shader_priv, struct wined3d_context *conte ...@@ -2413,7 +2425,8 @@ static void shader_none_disable(void *shader_priv, struct wined3d_context *conte
| (1u << WINED3D_SHADER_TYPE_VERTEX) | (1u << WINED3D_SHADER_TYPE_VERTEX)
| (1u << WINED3D_SHADER_TYPE_GEOMETRY) | (1u << WINED3D_SHADER_TYPE_GEOMETRY)
| (1u << WINED3D_SHADER_TYPE_HULL) | (1u << WINED3D_SHADER_TYPE_HULL)
| (1u << WINED3D_SHADER_TYPE_DOMAIN); | (1u << WINED3D_SHADER_TYPE_DOMAIN)
| (1u << WINED3D_SHADER_TYPE_COMPUTE);
} }
static HRESULT shader_none_alloc(struct wined3d_device *device, const struct wined3d_vertex_pipe_ops *vertex_pipe, static HRESULT shader_none_alloc(struct wined3d_device *device, const struct wined3d_vertex_pipe_ops *vertex_pipe,
...@@ -2475,6 +2488,7 @@ static void shader_none_get_caps(const struct wined3d_gl_info *gl_info, struct s ...@@ -2475,6 +2488,7 @@ static void shader_none_get_caps(const struct wined3d_gl_info *gl_info, struct s
caps->ds_version = 0; caps->ds_version = 0;
caps->gs_version = 0; caps->gs_version = 0;
caps->ps_version = 0; caps->ps_version = 0;
caps->cs_version = 0;
caps->vs_uniform_count = 0; caps->vs_uniform_count = 0;
caps->ps_uniform_count = 0; caps->ps_uniform_count = 0;
caps->ps_1x_max_value = 0.0f; caps->ps_1x_max_value = 0.0f;
...@@ -2584,8 +2598,11 @@ static HRESULT shader_set_function(struct wined3d_shader *shader, const DWORD *b ...@@ -2584,8 +2598,11 @@ static HRESULT shader_set_function(struct wined3d_shader *shader, const DWORD *b
case WINED3D_SHADER_TYPE_PIXEL: case WINED3D_SHADER_TYPE_PIXEL:
backend_version = d3d_info->limits.ps_version; backend_version = d3d_info->limits.ps_version;
break; break;
case WINED3D_SHADER_TYPE_COMPUTE:
backend_version = d3d_info->limits.cs_version;
break;
default: default:
FIXME("No backend version-checking for this shader type\n"); FIXME("No backend version-checking for this shader type.\n");
backend_version = 0; backend_version = 0;
} }
if (reg_maps->shader_version.major > backend_version) if (reg_maps->shader_version.major > backend_version)
......
...@@ -4186,6 +4186,7 @@ const char *debug_shader_type(enum wined3d_shader_type type) ...@@ -4186,6 +4186,7 @@ const char *debug_shader_type(enum wined3d_shader_type type)
WINED3D_TO_STR(WINED3D_SHADER_TYPE_GEOMETRY); WINED3D_TO_STR(WINED3D_SHADER_TYPE_GEOMETRY);
WINED3D_TO_STR(WINED3D_SHADER_TYPE_HULL); WINED3D_TO_STR(WINED3D_SHADER_TYPE_HULL);
WINED3D_TO_STR(WINED3D_SHADER_TYPE_DOMAIN); WINED3D_TO_STR(WINED3D_SHADER_TYPE_DOMAIN);
WINED3D_TO_STR(WINED3D_SHADER_TYPE_COMPUTE);
#undef WINED3D_TO_STR #undef WINED3D_TO_STR
default: default:
FIXME("Unrecognized shader type %#x.\n", type); FIXME("Unrecognized shader type %#x.\n", type);
......
...@@ -89,6 +89,7 @@ struct wined3d_settings wined3d_settings = ...@@ -89,6 +89,7 @@ struct wined3d_settings wined3d_settings =
~0U, /* No DS shader model limit by default. */ ~0U, /* No DS shader model limit by default. */
~0U, /* No GS shader model limit by default. */ ~0U, /* No GS shader model limit by default. */
~0U, /* No PS shader model limit by default. */ ~0U, /* No PS shader model limit by default. */
~0u, /* No CS shader model limit by default. */
FALSE, /* 3D support enabled by default. */ FALSE, /* 3D support enabled by default. */
}; };
...@@ -325,6 +326,8 @@ static BOOL wined3d_dll_init(HINSTANCE hInstDLL) ...@@ -325,6 +326,8 @@ static BOOL wined3d_dll_init(HINSTANCE hInstDLL)
TRACE("Limiting GS shader model to %u.\n", 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)) if (!get_config_key_dword(hkey, appkey, "MaxShaderModelPS", &wined3d_settings.max_sm_ps))
TRACE("Limiting PS shader model to %u.\n", wined3d_settings.max_sm_ps); TRACE("Limiting PS shader model to %u.\n", wined3d_settings.max_sm_ps);
if (!get_config_key_dword(hkey, appkey, "MaxShaderModelCS", &wined3d_settings.max_sm_cs))
TRACE("Limiting CS shader model to %u.\n", wined3d_settings.max_sm_cs);
if (!get_config_key(hkey, appkey, "DirectDrawRenderer", buffer, size) if (!get_config_key(hkey, appkey, "DirectDrawRenderer", buffer, size)
&& !strcmp(buffer, "gdi")) && !strcmp(buffer, "gdi"))
{ {
......
...@@ -308,6 +308,7 @@ struct wined3d_settings ...@@ -308,6 +308,7 @@ struct wined3d_settings
unsigned int max_sm_ds; unsigned int max_sm_ds;
unsigned int max_sm_gs; unsigned int max_sm_gs;
unsigned int max_sm_ps; unsigned int max_sm_ps;
unsigned int max_sm_cs;
BOOL no_3d; BOOL no_3d;
}; };
...@@ -738,6 +739,7 @@ enum wined3d_shader_type ...@@ -738,6 +739,7 @@ enum wined3d_shader_type
WINED3D_SHADER_TYPE_GEOMETRY, WINED3D_SHADER_TYPE_GEOMETRY,
WINED3D_SHADER_TYPE_HULL, WINED3D_SHADER_TYPE_HULL,
WINED3D_SHADER_TYPE_DOMAIN, WINED3D_SHADER_TYPE_DOMAIN,
WINED3D_SHADER_TYPE_COMPUTE,
WINED3D_SHADER_TYPE_COUNT, WINED3D_SHADER_TYPE_COUNT,
}; };
...@@ -981,6 +983,7 @@ struct shader_caps ...@@ -981,6 +983,7 @@ struct shader_caps
unsigned int ds_version; unsigned int ds_version;
unsigned int gs_version; unsigned int gs_version;
unsigned int ps_version; unsigned int ps_version;
unsigned int cs_version;
DWORD vs_uniform_count; DWORD vs_uniform_count;
DWORD ps_uniform_count; DWORD ps_uniform_count;
...@@ -2004,7 +2007,7 @@ struct wined3d_driver_info ...@@ -2004,7 +2007,7 @@ struct wined3d_driver_info
struct wined3d_d3d_limits struct wined3d_d3d_limits
{ {
unsigned int vs_version, hs_version, ds_version, gs_version, ps_version; unsigned int vs_version, hs_version, ds_version, gs_version, ps_version, cs_version;
DWORD vs_uniform_count; DWORD vs_uniform_count;
DWORD ps_uniform_count; DWORD ps_uniform_count;
UINT varying_count; UINT varying_count;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment