wined3d: Merge vertexshader_set_function() and pixelshader_set_function().
This commit is contained in:
parent
b548e387ae
commit
14da44aa36
|
@ -59,6 +59,51 @@ static HRESULT shader_get_function(IWineD3DBaseShaderImpl *shader, void *data, U
|
||||||
return WINED3D_OK;
|
return WINED3D_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static HRESULT shader_set_function(IWineD3DBaseShaderImpl *shader, const DWORD *byte_code,
|
||||||
|
const struct wined3d_shader_signature *output_signature, DWORD float_const_count)
|
||||||
|
{
|
||||||
|
struct shader_reg_maps *reg_maps = &shader->baseShader.reg_maps;
|
||||||
|
const struct wined3d_shader_frontend *fe;
|
||||||
|
HRESULT hr;
|
||||||
|
|
||||||
|
TRACE("shader %p, byte_code %p, output_signature %p, float_const_count %u.\n",
|
||||||
|
shader, byte_code, output_signature, float_const_count);
|
||||||
|
|
||||||
|
fe = shader_select_frontend(*byte_code);
|
||||||
|
if (!fe)
|
||||||
|
{
|
||||||
|
FIXME("Unable to find frontend for shader.\n");
|
||||||
|
return WINED3DERR_INVALIDCALL;
|
||||||
|
}
|
||||||
|
shader->baseShader.frontend = fe;
|
||||||
|
shader->baseShader.frontend_data = fe->shader_init(byte_code, output_signature);
|
||||||
|
if (!shader->baseShader.frontend_data)
|
||||||
|
{
|
||||||
|
FIXME("Failed to initialize frontend.\n");
|
||||||
|
return WINED3DERR_INVALIDCALL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* First pass: trace shader. */
|
||||||
|
if (TRACE_ON(d3d_shader)) shader_trace_init(fe, shader->baseShader.frontend_data, byte_code);
|
||||||
|
|
||||||
|
/* Initialize immediate constant lists. */
|
||||||
|
list_init(&shader->baseShader.constantsF);
|
||||||
|
list_init(&shader->baseShader.constantsB);
|
||||||
|
list_init(&shader->baseShader.constantsI);
|
||||||
|
|
||||||
|
/* Second pass: figure out which registers are used, what the semantics are, etc. */
|
||||||
|
hr = shader_get_registers_used((IWineD3DBaseShader *)shader, fe,
|
||||||
|
reg_maps, shader->baseShader.input_signature, shader->baseShader.output_signature,
|
||||||
|
byte_code, float_const_count);
|
||||||
|
if (FAILED(hr)) return hr;
|
||||||
|
|
||||||
|
shader->baseShader.function = HeapAlloc(GetProcessHeap(), 0, shader->baseShader.functionLength);
|
||||||
|
if (!shader->baseShader.function) return E_OUTOFMEMORY;
|
||||||
|
memcpy(shader->baseShader.function, byte_code, shader->baseShader.functionLength);
|
||||||
|
|
||||||
|
return WINED3D_OK;
|
||||||
|
}
|
||||||
|
|
||||||
static HRESULT STDMETHODCALLTYPE vertexshader_QueryInterface(IWineD3DVertexShader *iface, REFIID riid, void **object)
|
static HRESULT STDMETHODCALLTYPE vertexshader_QueryInterface(IWineD3DVertexShader *iface, REFIID riid, void **object)
|
||||||
{
|
{
|
||||||
TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object);
|
TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object);
|
||||||
|
@ -279,49 +324,29 @@ static void vertexshader_set_limits(IWineD3DVertexShaderImpl *shader)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT vertexshader_set_function(IWineD3DVertexShaderImpl *shader,
|
HRESULT vertexshader_init(IWineD3DVertexShaderImpl *shader, IWineD3DDeviceImpl *device,
|
||||||
const DWORD *byte_code, const struct wined3d_shader_signature *output_signature)
|
const DWORD *byte_code, const struct wined3d_shader_signature *output_signature,
|
||||||
|
IUnknown *parent, const struct wined3d_parent_ops *parent_ops)
|
||||||
{
|
{
|
||||||
IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *)shader->baseShader.device;
|
|
||||||
const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
|
const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
|
||||||
struct shader_reg_maps *reg_maps = &shader->baseShader.reg_maps;
|
struct shader_reg_maps *reg_maps = &shader->baseShader.reg_maps;
|
||||||
const struct wined3d_shader_frontend *fe;
|
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
WORD map;
|
WORD map;
|
||||||
|
|
||||||
TRACE("shader %p, byte_code %p, output_signature %p.\n", shader, byte_code, output_signature);
|
if (!byte_code) return WINED3DERR_INVALIDCALL;
|
||||||
|
|
||||||
fe = shader_select_frontend(*byte_code);
|
shader->lpVtbl = &IWineD3DVertexShader_Vtbl;
|
||||||
if (!fe)
|
shader_init(&shader->baseShader, device, parent, parent_ops);
|
||||||
|
|
||||||
|
hr = shader_set_function((IWineD3DBaseShaderImpl *)shader, byte_code,
|
||||||
|
output_signature, device->d3d_vshader_constantF);
|
||||||
|
if (FAILED(hr))
|
||||||
{
|
{
|
||||||
FIXME("Unable to find frontend for shader.\n");
|
WARN("Failed to set function, hr %#x.\n", hr);
|
||||||
return WINED3DERR_INVALIDCALL;
|
shader_cleanup((IWineD3DBaseShader *)shader);
|
||||||
|
return hr;
|
||||||
}
|
}
|
||||||
shader->baseShader.frontend = fe;
|
|
||||||
shader->baseShader.frontend_data = fe->shader_init(byte_code, output_signature);
|
|
||||||
if (!shader->baseShader.frontend_data)
|
|
||||||
{
|
|
||||||
FIXME("Failed to initialize frontend.\n");
|
|
||||||
return WINED3DERR_INVALIDCALL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* First pass: trace shader. */
|
|
||||||
if (TRACE_ON(d3d_shader)) shader_trace_init(fe, shader->baseShader.frontend_data, byte_code);
|
|
||||||
|
|
||||||
/* Initialize immediate constant lists. */
|
|
||||||
list_init(&shader->baseShader.constantsF);
|
|
||||||
list_init(&shader->baseShader.constantsB);
|
|
||||||
list_init(&shader->baseShader.constantsI);
|
|
||||||
|
|
||||||
/* Second pass: figure out registers used, semantics, etc. */
|
|
||||||
shader->min_rel_offset = device->d3d_vshader_constantF;
|
|
||||||
shader->max_rel_offset = 0;
|
|
||||||
hr = shader_get_registers_used((IWineD3DBaseShader *)shader, fe,
|
|
||||||
reg_maps, shader->baseShader.input_signature, shader->baseShader.output_signature,
|
|
||||||
byte_code, device->d3d_vshader_constantF);
|
|
||||||
if (FAILED(hr)) return hr;
|
|
||||||
|
|
||||||
|
|
||||||
map = shader->baseShader.reg_maps.input_registers;
|
map = shader->baseShader.reg_maps.input_registers;
|
||||||
for (i = 0; map; map >>= 1, ++i)
|
for (i = 0; map; map >>= 1, ++i)
|
||||||
|
@ -368,35 +393,10 @@ static HRESULT vertexshader_set_function(IWineD3DVertexShaderImpl *shader,
|
||||||
shader->rel_offset = 0;
|
shader->rel_offset = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
shader->baseShader.load_local_constsF = shader->baseShader.reg_maps.usesrelconstF
|
shader->baseShader.load_local_constsF = shader->baseShader.reg_maps.usesrelconstF
|
||||||
&& !list_empty(&shader->baseShader.constantsF);
|
&& !list_empty(&shader->baseShader.constantsF);
|
||||||
|
|
||||||
shader->baseShader.function = HeapAlloc(GetProcessHeap(), 0, shader->baseShader.functionLength);
|
|
||||||
if (!shader->baseShader.function) return E_OUTOFMEMORY;
|
|
||||||
memcpy(shader->baseShader.function, byte_code, shader->baseShader.functionLength);
|
|
||||||
|
|
||||||
return WINED3D_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
HRESULT vertexshader_init(IWineD3DVertexShaderImpl *shader, IWineD3DDeviceImpl *device,
|
|
||||||
const DWORD *byte_code, const struct wined3d_shader_signature *output_signature,
|
|
||||||
IUnknown *parent, const struct wined3d_parent_ops *parent_ops)
|
|
||||||
{
|
|
||||||
HRESULT hr;
|
|
||||||
|
|
||||||
if (!byte_code) return WINED3DERR_INVALIDCALL;
|
|
||||||
|
|
||||||
shader->lpVtbl = &IWineD3DVertexShader_Vtbl;
|
|
||||||
shader_init(&shader->baseShader, device, parent, parent_ops);
|
|
||||||
|
|
||||||
hr = vertexshader_set_function(shader, byte_code, output_signature);
|
|
||||||
if (FAILED(hr))
|
|
||||||
{
|
|
||||||
WARN("Failed to set function, hr %#x.\n", hr);
|
|
||||||
shader_cleanup((IWineD3DBaseShader *)shader);
|
|
||||||
return hr;
|
|
||||||
}
|
|
||||||
|
|
||||||
return WINED3D_OK;
|
return WINED3D_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -642,45 +642,27 @@ static void pixelshader_set_limits(IWineD3DPixelShaderImpl *shader)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT pixelshader_set_function(IWineD3DPixelShaderImpl *shader,
|
HRESULT pixelshader_init(IWineD3DPixelShaderImpl *shader, IWineD3DDeviceImpl *device,
|
||||||
const DWORD *byte_code, const struct wined3d_shader_signature *output_signature)
|
const DWORD *byte_code, const struct wined3d_shader_signature *output_signature,
|
||||||
|
IUnknown *parent, const struct wined3d_parent_ops *parent_ops)
|
||||||
{
|
{
|
||||||
IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *)shader->baseShader.device;
|
|
||||||
const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
|
const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
|
||||||
struct shader_reg_maps *reg_maps = &shader->baseShader.reg_maps;
|
|
||||||
unsigned int i, highest_reg_used = 0, num_regs_used = 0;
|
unsigned int i, highest_reg_used = 0, num_regs_used = 0;
|
||||||
const struct wined3d_shader_frontend *fe;
|
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
|
|
||||||
TRACE("shader %p, byte_code %p, output_signature %p.\n", shader, byte_code, output_signature);
|
if (!byte_code) return WINED3DERR_INVALIDCALL;
|
||||||
|
|
||||||
fe = shader_select_frontend(*byte_code);
|
shader->lpVtbl = &IWineD3DPixelShader_Vtbl;
|
||||||
if (!fe)
|
shader_init(&shader->baseShader, device, parent, parent_ops);
|
||||||
|
|
||||||
|
hr = shader_set_function((IWineD3DBaseShaderImpl *)shader, byte_code,
|
||||||
|
output_signature, device->d3d_pshader_constantF);
|
||||||
|
if (FAILED(hr))
|
||||||
{
|
{
|
||||||
FIXME("Unable to find frontend for shader.\n");
|
WARN("Failed to set function, hr %#x.\n", hr);
|
||||||
return WINED3DERR_INVALIDCALL;
|
shader_cleanup((IWineD3DBaseShader *)shader);
|
||||||
|
return hr;
|
||||||
}
|
}
|
||||||
shader->baseShader.frontend = fe;
|
|
||||||
shader->baseShader.frontend_data = fe->shader_init(byte_code, output_signature);
|
|
||||||
if (!shader->baseShader.frontend_data)
|
|
||||||
{
|
|
||||||
FIXME("Failed to initialize frontend.\n");
|
|
||||||
return WINED3DERR_INVALIDCALL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* First pass: trace shader. */
|
|
||||||
if (TRACE_ON(d3d_shader)) shader_trace_init(fe, shader->baseShader.frontend_data, byte_code);
|
|
||||||
|
|
||||||
/* Initialize immediate constant lists. */
|
|
||||||
list_init(&shader->baseShader.constantsF);
|
|
||||||
list_init(&shader->baseShader.constantsB);
|
|
||||||
list_init(&shader->baseShader.constantsI);
|
|
||||||
|
|
||||||
/* Second pass: figure out which registers are used, what the semantics are, etc.. */
|
|
||||||
hr = shader_get_registers_used((IWineD3DBaseShader *)shader, fe,
|
|
||||||
reg_maps, shader->baseShader.input_signature, NULL,
|
|
||||||
byte_code, device->d3d_pshader_constantF);
|
|
||||||
if (FAILED(hr)) return hr;
|
|
||||||
|
|
||||||
pixelshader_set_limits(shader);
|
pixelshader_set_limits(shader);
|
||||||
|
|
||||||
|
@ -725,32 +707,6 @@ static HRESULT pixelshader_set_function(IWineD3DPixelShaderImpl *shader,
|
||||||
|
|
||||||
shader->baseShader.load_local_constsF = FALSE;
|
shader->baseShader.load_local_constsF = FALSE;
|
||||||
|
|
||||||
shader->baseShader.function = HeapAlloc(GetProcessHeap(), 0, shader->baseShader.functionLength);
|
|
||||||
if (!shader->baseShader.function) return E_OUTOFMEMORY;
|
|
||||||
memcpy(shader->baseShader.function, byte_code, shader->baseShader.functionLength);
|
|
||||||
|
|
||||||
return WINED3D_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
HRESULT pixelshader_init(IWineD3DPixelShaderImpl *shader, IWineD3DDeviceImpl *device,
|
|
||||||
const DWORD *byte_code, const struct wined3d_shader_signature *output_signature,
|
|
||||||
IUnknown *parent, const struct wined3d_parent_ops *parent_ops)
|
|
||||||
{
|
|
||||||
HRESULT hr;
|
|
||||||
|
|
||||||
if (!byte_code) return WINED3DERR_INVALIDCALL;
|
|
||||||
|
|
||||||
shader->lpVtbl = &IWineD3DPixelShader_Vtbl;
|
|
||||||
shader_init(&shader->baseShader, device, parent, parent_ops);
|
|
||||||
|
|
||||||
hr = pixelshader_set_function(shader, byte_code, output_signature);
|
|
||||||
if (FAILED(hr))
|
|
||||||
{
|
|
||||||
WARN("Failed to set function, hr %#x.\n", hr);
|
|
||||||
shader_cleanup((IWineD3DBaseShader *)shader);
|
|
||||||
return hr;
|
|
||||||
}
|
|
||||||
|
|
||||||
return WINED3D_OK;
|
return WINED3D_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue