[PATCH 4/5] wined3d: Merge vertexshader_set_function() and pixelshader_set_function().
Henri Verbeet
hverbeet at codeweavers.com
Wed Dec 30 12:33:42 CST 2009
---
dlls/wined3d/shader.c | 188 +++++++++++++++++++------------------------------
1 files changed, 72 insertions(+), 116 deletions(-)
diff --git a/dlls/wined3d/shader.c b/dlls/wined3d/shader.c
index ae6a6e2..01ddfe6 100644
--- a/dlls/wined3d/shader.c
+++ b/dlls/wined3d/shader.c
@@ -59,6 +59,51 @@ static HRESULT shader_get_function(IWineD3DBaseShaderImpl *shader, void *data, U
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)
{
TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object);
@@ -279,50 +324,30 @@ static void vertexshader_set_limits(IWineD3DVertexShaderImpl *shader)
}
}
-static HRESULT vertexshader_set_function(IWineD3DVertexShaderImpl *shader,
- const DWORD *byte_code, const struct wined3d_shader_signature *output_signature)
+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)
{
- IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *)shader->baseShader.device;
const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
struct shader_reg_maps *reg_maps = &shader->baseShader.reg_maps;
- const struct wined3d_shader_frontend *fe;
unsigned int i;
HRESULT hr;
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);
- 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)
+ shader->lpVtbl = &IWineD3DVertexShader_Vtbl;
+ 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("Failed to initialize frontend.\n");
- return WINED3DERR_INVALIDCALL;
+ WARN("Failed to set function, hr %#x.\n", hr);
+ shader_cleanup((IWineD3DBaseShader *)shader);
+ return hr;
}
- /* 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;
for (i = 0; map; map >>= 1, ++i)
{
@@ -368,35 +393,10 @@ static HRESULT vertexshader_set_function(IWineD3DVertexShaderImpl *shader,
shader->rel_offset = 0;
}
}
+
shader->baseShader.load_local_constsF = shader->baseShader.reg_maps.usesrelconstF
&& !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;
}
@@ -642,46 +642,28 @@ static void pixelshader_set_limits(IWineD3DPixelShaderImpl *shader)
}
}
-static HRESULT pixelshader_set_function(IWineD3DPixelShaderImpl *shader,
- const DWORD *byte_code, const struct wined3d_shader_signature *output_signature)
+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)
{
- IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *)shader->baseShader.device;
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;
- const struct wined3d_shader_frontend *fe;
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);
- 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)
+ shader->lpVtbl = &IWineD3DPixelShader_Vtbl;
+ 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("Failed to initialize frontend.\n");
- return WINED3DERR_INVALIDCALL;
+ WARN("Failed to set function, hr %#x.\n", hr);
+ shader_cleanup((IWineD3DBaseShader *)shader);
+ return hr;
}
- /* 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);
for (i = 0; i < MAX_REG_INPUT; ++i)
@@ -725,32 +707,6 @@ static HRESULT pixelshader_set_function(IWineD3DPixelShaderImpl *shader,
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;
}
--
1.6.4.4
More information about the wine-patches
mailing list