forked from Mirrors/wine-wine
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 replacementoldstable
parent
f330815da5
commit
c48195e417
|
@ -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,
|
||||
};
|
||||
|
|
|
@ -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,
|
||||
};
|
||||
|
|
|
@ -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,
|
||||
};
|
||||
|
||||
/* *******************************************
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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,
|
||||
};
|
||||
|
|
1114
dlls/wined3d/state.c
1114
dlls/wined3d/state.c
File diff suppressed because it is too large
Load Diff
|
@ -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 */
|
||||
|
|
Loading…
Reference in New Issue