wined3d: Select the frontend based on the version token.
This commit is contained in:
parent
5f96c0083a
commit
dddd1f0211
|
@ -119,6 +119,23 @@ static const char *shader_opcode_names[] =
|
||||||
/* WINED3DSIH_TEXREG2RGB */ "texreg2rgb",
|
/* WINED3DSIH_TEXREG2RGB */ "texreg2rgb",
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define WINED3D_SM1_VS 0xfffe
|
||||||
|
#define WINED3D_SM1_PS 0xffff
|
||||||
|
|
||||||
|
const struct wined3d_shader_frontend *shader_select_frontend(DWORD version_token)
|
||||||
|
{
|
||||||
|
switch (version_token >> 16)
|
||||||
|
{
|
||||||
|
case WINED3D_SM1_VS:
|
||||||
|
case WINED3D_SM1_PS:
|
||||||
|
return &sm1_shader_frontend;
|
||||||
|
|
||||||
|
default:
|
||||||
|
FIXME("Unrecognised version token %#x\n", version_token);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static inline BOOL shader_is_version_token(DWORD token) {
|
static inline BOOL shader_is_version_token(DWORD token) {
|
||||||
return shader_is_pshader_version(token) ||
|
return shader_is_pshader_version(token) ||
|
||||||
shader_is_vshader_version(token);
|
shader_is_vshader_version(token);
|
||||||
|
|
|
@ -301,12 +301,20 @@ static HRESULT WINAPI IWineD3DPixelShaderImpl_SetFunction(IWineD3DPixelShader *i
|
||||||
IWineD3DDeviceImpl *deviceImpl = (IWineD3DDeviceImpl *) This->baseShader.device;
|
IWineD3DDeviceImpl *deviceImpl = (IWineD3DDeviceImpl *) This->baseShader.device;
|
||||||
unsigned int i, highest_reg_used = 0, num_regs_used = 0;
|
unsigned int i, highest_reg_used = 0, num_regs_used = 0;
|
||||||
shader_reg_maps *reg_maps = &This->baseShader.reg_maps;
|
shader_reg_maps *reg_maps = &This->baseShader.reg_maps;
|
||||||
|
const struct wined3d_shader_frontend *fe;
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
|
|
||||||
TRACE("(%p) : pFunction %p\n", iface, pFunction);
|
TRACE("(%p) : pFunction %p\n", iface, pFunction);
|
||||||
|
|
||||||
|
fe = shader_select_frontend(*pFunction);
|
||||||
|
if (!fe)
|
||||||
|
{
|
||||||
|
FIXME("Unable to find frontend for shader.\n");
|
||||||
|
return WINED3DERR_INVALIDCALL;
|
||||||
|
}
|
||||||
|
|
||||||
/* First pass: trace shader */
|
/* First pass: trace shader */
|
||||||
if (TRACE_ON(d3d_shader)) shader_trace_init(&sm1_shader_frontend, pFunction, This->baseShader.shader_ins);
|
if (TRACE_ON(d3d_shader)) shader_trace_init(fe, pFunction, This->baseShader.shader_ins);
|
||||||
|
|
||||||
/* Initialize immediate constant lists */
|
/* Initialize immediate constant lists */
|
||||||
list_init(&This->baseShader.constantsF);
|
list_init(&This->baseShader.constantsF);
|
||||||
|
@ -314,8 +322,7 @@ static HRESULT WINAPI IWineD3DPixelShaderImpl_SetFunction(IWineD3DPixelShader *i
|
||||||
list_init(&This->baseShader.constantsI);
|
list_init(&This->baseShader.constantsI);
|
||||||
|
|
||||||
/* Second pass: figure out which registers are used, what the semantics are, etc.. */
|
/* Second pass: figure out which registers are used, what the semantics are, etc.. */
|
||||||
hr = shader_get_registers_used((IWineD3DBaseShader *)This, &sm1_shader_frontend,
|
hr = shader_get_registers_used((IWineD3DBaseShader *)This, fe, reg_maps, This->semantics_in, NULL, pFunction);
|
||||||
reg_maps, This->semantics_in, NULL, pFunction);
|
|
||||||
if (FAILED(hr)) return hr;
|
if (FAILED(hr)) return hr;
|
||||||
|
|
||||||
pshader_set_limits(This);
|
pshader_set_limits(This);
|
||||||
|
@ -422,10 +429,18 @@ static GLuint pixelshader_compile(IWineD3DPixelShaderImpl *This, const struct ps
|
||||||
CONST DWORD *function = This->baseShader.function;
|
CONST DWORD *function = This->baseShader.function;
|
||||||
GLuint retval;
|
GLuint retval;
|
||||||
SHADER_BUFFER buffer;
|
SHADER_BUFFER buffer;
|
||||||
|
const struct wined3d_shader_frontend *fe;
|
||||||
IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *) This->baseShader.device;
|
IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *) This->baseShader.device;
|
||||||
|
|
||||||
TRACE("(%p) : function %p\n", This, function);
|
TRACE("(%p) : function %p\n", This, function);
|
||||||
|
|
||||||
|
fe = shader_select_frontend(This->baseShader.reg_maps.shader_version);
|
||||||
|
if (!fe)
|
||||||
|
{
|
||||||
|
FIXME("Unable to find frontend for shader.\n");
|
||||||
|
return WINED3DERR_INVALIDCALL;
|
||||||
|
}
|
||||||
|
|
||||||
pixelshader_update_samplers(&This->baseShader.reg_maps,
|
pixelshader_update_samplers(&This->baseShader.reg_maps,
|
||||||
((IWineD3DDeviceImpl *)This->baseShader.device)->stateBlock->textures);
|
((IWineD3DDeviceImpl *)This->baseShader.device)->stateBlock->textures);
|
||||||
|
|
||||||
|
@ -433,8 +448,7 @@ static GLuint pixelshader_compile(IWineD3DPixelShaderImpl *This, const struct ps
|
||||||
TRACE("(%p) : Generating hardware program\n", This);
|
TRACE("(%p) : Generating hardware program\n", This);
|
||||||
This->cur_args = args;
|
This->cur_args = args;
|
||||||
shader_buffer_init(&buffer);
|
shader_buffer_init(&buffer);
|
||||||
retval = device->shader_backend->shader_generate_pshader((IWineD3DPixelShader *)This,
|
retval = device->shader_backend->shader_generate_pshader((IWineD3DPixelShader *)This, fe, &buffer, args);
|
||||||
&sm1_shader_frontend, &buffer, args);
|
|
||||||
shader_buffer_free(&buffer);
|
shader_buffer_free(&buffer);
|
||||||
This->cur_args = NULL;
|
This->cur_args = NULL;
|
||||||
|
|
||||||
|
|
|
@ -313,13 +313,21 @@ static HRESULT WINAPI IWineD3DVertexShaderImpl_SetFunction(IWineD3DVertexShader
|
||||||
|
|
||||||
IWineD3DVertexShaderImpl *This =(IWineD3DVertexShaderImpl *)iface;
|
IWineD3DVertexShaderImpl *This =(IWineD3DVertexShaderImpl *)iface;
|
||||||
IWineD3DDeviceImpl *deviceImpl = (IWineD3DDeviceImpl *) This->baseShader.device;
|
IWineD3DDeviceImpl *deviceImpl = (IWineD3DDeviceImpl *) This->baseShader.device;
|
||||||
|
const struct wined3d_shader_frontend *fe;
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
shader_reg_maps *reg_maps = &This->baseShader.reg_maps;
|
shader_reg_maps *reg_maps = &This->baseShader.reg_maps;
|
||||||
|
|
||||||
TRACE("(%p) : pFunction %p\n", iface, pFunction);
|
TRACE("(%p) : pFunction %p\n", iface, pFunction);
|
||||||
|
|
||||||
|
fe = shader_select_frontend(*pFunction);
|
||||||
|
if (!fe)
|
||||||
|
{
|
||||||
|
FIXME("Unable to find frontend for shader.\n");
|
||||||
|
return WINED3DERR_INVALIDCALL;
|
||||||
|
}
|
||||||
|
|
||||||
/* First pass: trace shader */
|
/* First pass: trace shader */
|
||||||
if (TRACE_ON(d3d_shader)) shader_trace_init(&sm1_shader_frontend, pFunction, This->baseShader.shader_ins);
|
if (TRACE_ON(d3d_shader)) shader_trace_init(fe, pFunction, This->baseShader.shader_ins);
|
||||||
|
|
||||||
/* Initialize immediate constant lists */
|
/* Initialize immediate constant lists */
|
||||||
list_init(&This->baseShader.constantsF);
|
list_init(&This->baseShader.constantsF);
|
||||||
|
@ -329,7 +337,7 @@ static HRESULT WINAPI IWineD3DVertexShaderImpl_SetFunction(IWineD3DVertexShader
|
||||||
/* Second pass: figure out registers used, semantics, etc.. */
|
/* Second pass: figure out registers used, semantics, etc.. */
|
||||||
This->min_rel_offset = GL_LIMITS(vshader_constantsF);
|
This->min_rel_offset = GL_LIMITS(vshader_constantsF);
|
||||||
This->max_rel_offset = 0;
|
This->max_rel_offset = 0;
|
||||||
hr = shader_get_registers_used((IWineD3DBaseShader*) This, &sm1_shader_frontend,
|
hr = shader_get_registers_used((IWineD3DBaseShader*) This, fe,
|
||||||
reg_maps, This->semantics_in, This->semantics_out, pFunction);
|
reg_maps, This->semantics_in, This->semantics_out, pFunction);
|
||||||
if (hr != WINED3D_OK) return hr;
|
if (hr != WINED3D_OK) return hr;
|
||||||
|
|
||||||
|
@ -404,15 +412,22 @@ static HRESULT WINAPI IWIneD3DVertexShaderImpl_SetLocalConstantsF(IWineD3DVertex
|
||||||
|
|
||||||
static GLuint vertexshader_compile(IWineD3DVertexShaderImpl *This, const struct vs_compile_args *args) {
|
static GLuint vertexshader_compile(IWineD3DVertexShaderImpl *This, const struct vs_compile_args *args) {
|
||||||
IWineD3DDeviceImpl *deviceImpl = (IWineD3DDeviceImpl *) This->baseShader.device;
|
IWineD3DDeviceImpl *deviceImpl = (IWineD3DDeviceImpl *) This->baseShader.device;
|
||||||
|
const struct wined3d_shader_frontend *fe;
|
||||||
SHADER_BUFFER buffer;
|
SHADER_BUFFER buffer;
|
||||||
GLuint ret;
|
GLuint ret;
|
||||||
|
|
||||||
|
fe = shader_select_frontend(This->baseShader.reg_maps.shader_version);
|
||||||
|
if (!fe)
|
||||||
|
{
|
||||||
|
FIXME("Unable to find frontend for shader.\n");
|
||||||
|
return WINED3DERR_INVALIDCALL;
|
||||||
|
}
|
||||||
|
|
||||||
/* Generate the HW shader */
|
/* Generate the HW shader */
|
||||||
TRACE("(%p) : Generating hardware program\n", This);
|
TRACE("(%p) : Generating hardware program\n", This);
|
||||||
shader_buffer_init(&buffer);
|
shader_buffer_init(&buffer);
|
||||||
This->cur_args = args;
|
This->cur_args = args;
|
||||||
ret = deviceImpl->shader_backend->shader_generate_vshader((IWineD3DVertexShader *)This,
|
ret = deviceImpl->shader_backend->shader_generate_vshader((IWineD3DVertexShader *)This, fe, &buffer, args);
|
||||||
&sm1_shader_frontend, &buffer, args);
|
|
||||||
This->cur_args = NULL;
|
This->cur_args = NULL;
|
||||||
shader_buffer_free(&buffer);
|
shader_buffer_free(&buffer);
|
||||||
|
|
||||||
|
|
|
@ -2555,6 +2555,7 @@ HRESULT shader_get_registers_used(IWineD3DBaseShader *iface, const struct wined3
|
||||||
struct wined3d_shader_semantic *semantics_out, const DWORD *byte_code);
|
struct wined3d_shader_semantic *semantics_out, const DWORD *byte_code);
|
||||||
void shader_init(struct IWineD3DBaseShaderClass *shader,
|
void shader_init(struct IWineD3DBaseShaderClass *shader,
|
||||||
IWineD3DDevice *device, const SHADER_OPCODE *instruction_table);
|
IWineD3DDevice *device, const SHADER_OPCODE *instruction_table);
|
||||||
|
const struct wined3d_shader_frontend *shader_select_frontend(DWORD version_token);
|
||||||
void shader_trace_init(const struct wined3d_shader_frontend *fe,
|
void shader_trace_init(const struct wined3d_shader_frontend *fe,
|
||||||
const DWORD *pFunction, const SHADER_OPCODE *opcode_table);
|
const DWORD *pFunction, const SHADER_OPCODE *opcode_table);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue