[2/8] wined3d: Select the right shader backend when creating the
device
H. Verbeet
hverbeet at gmail.com
Mon Nov 27 13:50:43 CST 2006
Changelog:
- Select the right shader backend when creating the device
-------------- next part --------------
---
dlls/wined3d/directx.c | 7 +++++++
dlls/wined3d/drawprim.c | 22 ++++------------------
dlls/wined3d/wined3d_private.h | 1 +
3 files changed, 12 insertions(+), 18 deletions(-)
diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index 368f384..5fc22d6 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -2438,6 +2438,13 @@ static HRESULT WINAPI IWineD3DImpl_Crea
IWineD3DImpl_FillGLCaps(iface, IWineD3DImpl_GetAdapterDisplay(iface, Adapter));
LEAVE_GL();
select_shader_mode(&This->gl_info, DeviceType, &object->ps_selected_mode, &object->vs_selected_mode);
+ if (object->ps_selected_mode == SHADER_GLSL || object->vs_selected_mode == SHADER_GLSL) {
+ object->shader_backend = &glsl_shader_backend;
+ } else if (object->ps_selected_mode == SHADER_ARB || object->vs_selected_mode == SHADER_ARB) {
+ object->shader_backend = &arb_program_shader_backend;
+ } else {
+ object->shader_backend = &none_shader_backend;
+ }
/* This function should *not* be modifying GL caps
* TODO: move the functionality where it belongs */
diff --git a/dlls/wined3d/drawprim.c b/dlls/wined3d/drawprim.c
index 0c708c3..05e8f78 100644
--- a/dlls/wined3d/drawprim.c
+++ b/dlls/wined3d/drawprim.c
@@ -1802,18 +1802,10 @@ #undef BUFFER_OR_DATA
}
/* Make any shaders active */
- if (This->vs_selected_mode == SHADER_GLSL || This->ps_selected_mode == SHADER_GLSL) {
- glsl_shader_backend.shader_select(iface, usePixelShaderFunction, useVertexShaderFunction);
- } else if (This->vs_selected_mode == SHADER_ARB || This->ps_selected_mode == SHADER_ARB) {
- arb_program_shader_backend.shader_select(iface, usePixelShaderFunction, useVertexShaderFunction);
- }
+ This->shader_backend->shader_select(iface, usePixelShaderFunction, useVertexShaderFunction);
/* Load any global constants/uniforms that may have been set by the application */
- if (This->vs_selected_mode == SHADER_GLSL || This->ps_selected_mode == SHADER_GLSL) {
- glsl_shader_backend.shader_load_constants(iface, usePixelShaderFunction, useVertexShaderFunction);
- } else if (This->vs_selected_mode == SHADER_ARB || This->ps_selected_mode == SHADER_ARB) {
- arb_program_shader_backend.shader_load_constants(iface, usePixelShaderFunction, useVertexShaderFunction);
- }
+ This->shader_backend->shader_load_constants(iface, usePixelShaderFunction, useVertexShaderFunction);
/* Draw vertex-by-vertex */
if (useDrawStridedSlow)
@@ -1822,11 +1814,7 @@ #undef BUFFER_OR_DATA
drawStridedFast(iface, numberOfIndicies, glPrimType, idxData, idxSize, minIndex, StartIdx);
/* Cleanup any shaders */
- if (This->vs_selected_mode == SHADER_GLSL || This->ps_selected_mode == SHADER_GLSL) {
- glsl_shader_backend.shader_cleanup(usePixelShaderFunction, useVertexShaderFunction);
- } else if (This->vs_selected_mode == SHADER_ARB || This->ps_selected_mode == SHADER_ARB) {
- arb_program_shader_backend.shader_cleanup(usePixelShaderFunction, useVertexShaderFunction);
- }
+ This->shader_backend->shader_cleanup(usePixelShaderFunction, useVertexShaderFunction);
/* Unload vertex data */
if (useVertexShaderFunction) {
@@ -2046,7 +2034,6 @@ static void check_fbo_status(IWineD3DDev
static void depth_blt(IWineD3DDevice *iface, GLuint texture) {
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
- BOOL glsl_mode = This->vs_selected_mode == SHADER_GLSL || This->ps_selected_mode == SHADER_GLSL;
glPushAttrib(GL_ENABLE_BIT | GL_DEPTH_BUFFER_BIT);
@@ -2061,8 +2048,7 @@ static void depth_blt(IWineD3DDevice *if
glBindTexture(GL_TEXTURE_2D, texture);
glEnable(GL_TEXTURE_2D);
- if (glsl_mode) glsl_shader_backend.shader_select_depth_blt(iface);
- else arb_program_shader_backend.shader_select_depth_blt(iface);
+ This->shader_backend->shader_select_depth_blt(iface);
glBegin(GL_TRIANGLE_STRIP);
glVertex2f(-1.0f, -1.0f);
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 8db15e0..0776767 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -515,6 +515,7 @@ typedef struct IWineD3DDeviceImpl
/* Selected capabilities */
int vs_selected_mode;
int ps_selected_mode;
+ const shader_backend_t *shader_backend;
/* Optimization */
BOOL modelview_valid;
More information about the wine-patches
mailing list