wined3d: Move shader_fragment_enable to the fragment pipeline implementation.

It isn't related to the shader backend any longer. The nvts_enable in
the ffp code isn't quite right as well, it should be moved away once
there is a dedicated nvts fragment pipeline replacement
oldstable
Stefan Dösinger 2008-07-04 15:09:49 -05:00 committed by Alexandre Julliard
parent f330815da5
commit c48195e417
8 changed files with 64 additions and 1143 deletions

View File

@ -2120,10 +2120,6 @@ static void shader_arb_get_caps(WINED3DDEVTYPE devtype, WineD3D_GL_Info *gl_info
}
}
static void shader_arb_fragment_enable(IWineD3DDevice *iface, BOOL enable) {
none_shader_backend.shader_fragment_enable(iface, enable);
}
const shader_backend_t arb_program_shader_backend = {
shader_arb_select,
shader_arb_select_depth_blt,
@ -2138,5 +2134,4 @@ const shader_backend_t arb_program_shader_backend = {
shader_arb_generate_pshader,
shader_arb_generate_vshader,
shader_arb_get_caps,
shader_arb_fragment_enable,
};

View File

@ -853,7 +853,7 @@ static void set_bumpmat(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3D
}
#undef GLINFO_LOCATION
const struct StateEntryTemplate atifs_fragmentstate_template[] = {
static const struct StateEntryTemplate atifs_fragmentstate_template[] = {
{STATE_RENDER(WINED3DRS_TEXTUREFACTOR), { STATE_RENDER(WINED3DRS_TEXTUREFACTOR), state_texfactor_atifs }},
{STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }},
{STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }},
@ -962,6 +962,21 @@ const struct StateEntryTemplate atifs_fragmentstate_template[] = {
{0 /* Terminate */, { 0, 0 }},
};
static void atifs_enable(IWineD3DDevice *iface, BOOL enable) {
if(enable) {
glEnable(GL_FRAGMENT_SHADER_ATI);
checkGLcall("glEnable(GL_FRAGMENT_SHADER_ATI)");
} else {
glDisable(GL_FRAGMENT_SHADER_ATI);
checkGLcall("glDisable(GL_FRAGMENT_SHADER_ATI)");
}
}
const struct fragment_pipeline atifs_fragment_pipeline = {
atifs_enable,
atifs_fragmentstate_template
};
/* GL_ATI_fragment_shader backend.It borrows a lot from a the
* ARB shader backend, currently the whole vertex processing
* code. This code would also forward pixel shaders, but if
@ -1098,16 +1113,6 @@ static void shader_atifs_generate_vshader(IWineD3DVertexShader *iface, SHADER_BU
arb_program_shader_backend.shader_generate_vshader(iface, buffer);
}
static void shader_atifs_fragment_enable(IWineD3DDevice *iface, BOOL enable) {
if(enable) {
glEnable(GL_FRAGMENT_SHADER_ATI);
checkGLcall("glEnable(GL_FRAGMENT_SHADER_ATI)");
} else {
glDisable(GL_FRAGMENT_SHADER_ATI);
checkGLcall("glDisable(GL_FRAGMENT_SHADER_ATI)");
}
}
const shader_backend_t atifs_shader_backend = {
shader_atifs_select,
shader_atifs_select_depth_blt,
@ -1122,5 +1127,4 @@ const shader_backend_t atifs_shader_backend = {
shader_atifs_generate_pshader,
shader_atifs_generate_vshader,
shader_atifs_get_caps,
shader_atifs_fragment_enable,
};

View File

@ -1182,21 +1182,6 @@ static void shader_none_get_caps(WINED3DDEVTYPE devtype, WineD3D_GL_Info *gl_inf
}
static void shader_none_fragment_enable(IWineD3DDevice *iface, BOOL enable) {
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *) iface;
WineD3D_GL_Info *gl_info = &This->adapter->gl_info;
if(GL_SUPPORT(NV_TEXTURE_SHADER2)) {
if(enable) {
glEnable(GL_TEXTURE_SHADER_NV);
checkGLcall("glEnable(GL_TEXTURE_SHADER_NV)");
} else {
glDisable(GL_TEXTURE_SHADER_NV);
checkGLcall("glDisable(GL_TEXTURE_SHADER_NV)");
}
}
}
#undef GLINFO_LOCATION
const shader_backend_t none_shader_backend = {
@ -1213,7 +1198,6 @@ const shader_backend_t none_shader_backend = {
shader_none_generate_pshader,
shader_none_generate_vshader,
shader_none_get_caps,
shader_none_fragment_enable,
};
/* *******************************************

View File

@ -448,7 +448,7 @@ WineD3DContext *CreateContext(IWineD3DDeviceImpl *This, IWineD3DSurfaceImpl *tar
oldDrawable = pwglGetCurrentDC();
if(oldCtx && oldDrawable) {
/* See comment in ActivateContext context switching */
This->shader_backend->shader_fragment_enable((IWineD3DDevice *) This, FALSE);
This->frag_pipe->enable_extension((IWineD3DDevice *) This, FALSE);
}
if(pwglMakeCurrent(hdc, ctx) == FALSE) {
ERR("Cannot activate context to set up defaults\n");
@ -533,7 +533,7 @@ WineD3DContext *CreateContext(IWineD3DDeviceImpl *This, IWineD3DSurfaceImpl *tar
if(oldDrawable && oldCtx) {
pwglMakeCurrent(oldDrawable, oldCtx);
}
This->shader_backend->shader_fragment_enable((IWineD3DDevice *) This, TRUE);
This->frag_pipe->enable_extension((IWineD3DDevice *) This, TRUE);
out:
return ret;
@ -792,7 +792,7 @@ static inline void SetupForBlit(IWineD3DDeviceImpl *This, WineD3DContext *contex
Context_MarkStateDirty(context, STATE_TRANSFORM(WINED3DTS_PROJECTION), StateTable);
This->shader_backend->shader_fragment_enable((IWineD3DDevice *) This, FALSE);
This->frag_pipe->enable_extension((IWineD3DDevice *) This, FALSE);
}
/*****************************************************************************
@ -1057,12 +1057,12 @@ void ActivateContext(IWineD3DDeviceImpl *This, IWineD3DSurface *target, ContextU
else {
TRACE("Switching gl ctx to %p, hdc=%p ctx=%p\n", context, context->hdc, context->glCtx);
This->shader_backend->shader_fragment_enable((IWineD3DDevice *) This, FALSE);
This->frag_pipe->enable_extension((IWineD3DDevice *) This, FALSE);
ret = pwglMakeCurrent(context->hdc, context->glCtx);
if(ret == FALSE) {
ERR("Failed to activate the new context\n");
} else if(!context->last_was_blit) {
This->shader_backend->shader_fragment_enable((IWineD3DDevice *) This, TRUE);
This->frag_pipe->enable_extension((IWineD3DDevice *) This, TRUE);
}
}
if(This->activeContext->vshader_const_dirty) {
@ -1094,7 +1094,7 @@ void ActivateContext(IWineD3DDeviceImpl *This, IWineD3DSurface *target, ContextU
case CTXUSAGE_CLEAR:
if(context->last_was_blit) {
This->shader_backend->shader_fragment_enable((IWineD3DDevice *) This, TRUE);
This->frag_pipe->enable_extension((IWineD3DDevice *) This, TRUE);
}
/* Blending and clearing should be orthogonal, but tests on the nvidia driver show that disabling
@ -1113,7 +1113,7 @@ void ActivateContext(IWineD3DDeviceImpl *This, IWineD3DSurface *target, ContextU
case CTXUSAGE_DRAWPRIM:
/* This needs all dirty states applied */
if(context->last_was_blit) {
This->shader_backend->shader_fragment_enable((IWineD3DDevice *) This, TRUE);
This->frag_pipe->enable_extension((IWineD3DDevice *) This, TRUE);
}
IWineD3DDeviceImpl_FindTexUnitMap(This);

View File

@ -2890,17 +2890,17 @@ static const shader_backend_t *select_shader_backend(UINT Adapter, WINED3DDEVTYP
return ret;
}
static const struct StateEntryTemplate *select_fragment_implementation(UINT Adapter, WINED3DDEVTYPE DeviceType) {
static const struct fragment_pipeline *select_fragment_implementation(UINT Adapter, WINED3DDEVTYPE DeviceType) {
int vs_selected_mode;
int ps_selected_mode;
select_shader_mode(&GLINFO_LOCATION, DeviceType, &ps_selected_mode, &vs_selected_mode);
if (ps_selected_mode == SHADER_GLSL || ps_selected_mode == SHADER_ARB) {
return ffp_fragmentstate_template;
return &ffp_fragment_pipeline;
} else if (ps_selected_mode != SHADER_NONE && !GL_SUPPORT(ARB_FRAGMENT_PROGRAM)) {
return atifs_fragmentstate_template;
return &atifs_fragment_pipeline;
} else {
return ffp_fragmentstate_template;
return &ffp_fragment_pipeline;
}
}
@ -3407,7 +3407,7 @@ static HRESULT WINAPI IWineD3DImpl_CreateDevice(IWineD3D *iface, UINT Adapter,
IWineD3DDeviceImpl *object = NULL;
IWineD3DImpl *This = (IWineD3DImpl *)iface;
WINED3DDISPLAYMODE mode;
const struct StateEntryTemplate *frag_pipeline = NULL;
const struct fragment_pipeline *frag_pipeline = NULL;
int i;
/* Validate the adapter number. If no adapters are available(no GL), ignore the adapter
@ -3462,7 +3462,7 @@ static HRESULT WINAPI IWineD3DImpl_CreateDevice(IWineD3D *iface, UINT Adapter,
object->shader_backend = select_shader_backend(Adapter, DeviceType);
frag_pipeline = select_fragment_implementation(Adapter, DeviceType);
object->frag_pipe = frag_pipeline;
compile_state_table(object->StateTable, object->multistate_funcs,
ffp_vertexstate_template, frag_pipeline, misc_state_template);

View File

@ -3701,10 +3701,6 @@ static void shader_glsl_get_caps(WINED3DDEVTYPE devtype, WineD3D_GL_Info *gl_inf
TRACE_(d3d_caps)("Hardware pixel shader version %d.%d enabled (GLSL)\n", (pCaps->PixelShaderVersion >> 8) & 0xff, pCaps->PixelShaderVersion & 0xff);
}
static void shader_glsl_fragment_enable(IWineD3DDevice *iface, BOOL enable) {
none_shader_backend.shader_fragment_enable(iface, enable);
}
const shader_backend_t glsl_shader_backend = {
shader_glsl_select,
shader_glsl_select_depth_blt,
@ -3719,5 +3715,4 @@ const shader_backend_t glsl_shader_backend = {
shader_glsl_generate_pshader,
shader_glsl_generate_vshader,
shader_glsl_get_caps,
shader_glsl_fragment_enable,
};

File diff suppressed because it is too large Load Diff

View File

@ -253,7 +253,6 @@ typedef struct {
void (*shader_generate_pshader)(IWineD3DPixelShader *iface, SHADER_BUFFER *buffer);
void (*shader_generate_vshader)(IWineD3DVertexShader *iface, SHADER_BUFFER *buffer);
void (*shader_get_caps)(WINED3DDEVTYPE devtype, WineD3D_GL_Info *gl_info, struct shader_caps *caps);
void (*shader_fragment_enable)(IWineD3DDevice *iface, BOOL enable);
} shader_backend_t;
extern const shader_backend_t atifs_shader_backend;
@ -547,16 +546,21 @@ struct StateEntryTemplate
struct StateEntry content;
};
struct fragment_pipeline {
void (*enable_extension)(IWineD3DDevice *iface, BOOL enable);
const struct StateEntryTemplate *states;
};
extern const struct StateEntryTemplate misc_state_template[];
extern const struct StateEntryTemplate ffp_vertexstate_template[];
extern const struct StateEntryTemplate ffp_fragmentstate_template[];
extern const struct StateEntryTemplate atifs_fragmentstate_template[];
extern const struct fragment_pipeline ffp_fragment_pipeline;
extern const struct fragment_pipeline atifs_fragment_pipeline;
/* "Base" state table */
void compile_state_table(struct StateEntry *StateTable,
APPLYSTATEFUNC **dev_multistate_funcs,
const struct StateEntryTemplate *vertex,
const struct StateEntryTemplate *fragment,
const struct fragment_pipeline *fragment,
const struct StateEntryTemplate *misc);
/* The new context manager that should deal with onscreen and offscreen rendering */
@ -784,6 +788,7 @@ struct IWineD3DDeviceImpl
struct StateEntry StateTable[STATE_HIGHEST + 1];
/* Array of functions for states which are handled by more than one pipeline part */
APPLYSTATEFUNC *multistate_funcs[STATE_HIGHEST + 1];
const struct fragment_pipeline *frag_pipe;
/* To store */
BOOL view_ident; /* true iff view matrix is identity */