Commit 51e64b3f authored by Stefan Dösinger's avatar Stefan Dösinger Committed by Alexandre Julliard

wined3d: Move fixed function texture dimension updates to the fragment pipeline.

This is a further separation of the sampler state, and a preparation to move the nv texture shader stuff to its own pipeline implementation.
parent d3c29b70
......@@ -958,6 +958,14 @@ static const struct StateEntryTemplate atifs_fragmentstate_template[] = {
{STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), set_bumpmat }},
{STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), set_bumpmat }},
{STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), set_bumpmat }},
{ STATE_SAMPLER(0), { STATE_SAMPLER(0), sampler_texdim }},
{ STATE_SAMPLER(1), { STATE_SAMPLER(1), sampler_texdim }},
{ STATE_SAMPLER(2), { STATE_SAMPLER(2), sampler_texdim }},
{ STATE_SAMPLER(3), { STATE_SAMPLER(3), sampler_texdim }},
{ STATE_SAMPLER(4), { STATE_SAMPLER(4), sampler_texdim }},
{ STATE_SAMPLER(5), { STATE_SAMPLER(5), sampler_texdim }},
{ STATE_SAMPLER(6), { STATE_SAMPLER(6), sampler_texdim }},
{ STATE_SAMPLER(7), { STATE_SAMPLER(7), sampler_texdim }},
{0 /* Terminate */, { 0, 0 }},
};
......
......@@ -2430,10 +2430,6 @@ static void sampler(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DCont
glEnable(stateblock->textureDimensions[sampler]);
checkGLcall("glEnable(stateblock->textureDimensions[sampler])");
} else if(sampler < stateblock->lowest_disabled_stage) {
if(!isStateDirty(context, STATE_TEXTURESTAGE(sampler, WINED3DTSS_COLOROP))) {
texture_activate_dimensions(sampler, stateblock, context);
}
if(stateblock->renderState[WINED3DRS_COLORKEYENABLE] && sampler == 0) {
/* If color keying is enabled update the alpha test, it depends on the existence
* of a color key in stage 0
......@@ -2444,10 +2440,6 @@ static void sampler(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DCont
} else if(mapped_stage < GL_LIMITS(textures)) {
if(sampler < stateblock->lowest_disabled_stage) {
/* TODO: What should I do with pixel shaders here ??? */
if(!isStateDirty(context, STATE_TEXTURESTAGE(sampler, WINED3DTSS_COLOROP))) {
texture_activate_dimensions(sampler, stateblock, context);
}
if(stateblock->renderState[WINED3DRS_COLORKEYENABLE] && sampler == 0) {
/* If color keying is enabled update the alpha test, it depends on the existence
* of a color key in stage 0
......@@ -4460,6 +4452,14 @@ static const struct StateEntryTemplate ffp_fragmentstate_template[] = {
{ STATE_RENDER(WINED3DRS_SRGBWRITEENABLE), { STATE_PIXELSHADER, pixelshader }},
{ STATE_RENDER(WINED3DRS_BORDERCOLOR), { STATE_RENDER(WINED3DRS_BORDERCOLOR), state_bordercolor }},
{ STATE_RENDER(WINED3DRS_TEXTUREFACTOR), { STATE_RENDER(WINED3DRS_TEXTUREFACTOR), state_texfactor }},
{ STATE_SAMPLER(0), { STATE_SAMPLER(0), sampler_texdim }},
{ STATE_SAMPLER(1), { STATE_SAMPLER(1), sampler_texdim }},
{ STATE_SAMPLER(2), { STATE_SAMPLER(2), sampler_texdim }},
{ STATE_SAMPLER(3), { STATE_SAMPLER(3), sampler_texdim }},
{ STATE_SAMPLER(4), { STATE_SAMPLER(4), sampler_texdim }},
{ STATE_SAMPLER(5), { STATE_SAMPLER(5), sampler_texdim }},
{ STATE_SAMPLER(6), { STATE_SAMPLER(6), sampler_texdim }},
{ STATE_SAMPLER(7), { STATE_SAMPLER(7), sampler_texdim }},
{0 /* Terminate */, { 0, 0 }},
};
#undef GLINFO_LOCATION
......
......@@ -3498,4 +3498,20 @@ void texture_activate_dimensions(DWORD stage, IWineD3DStateBlockImpl *stateblock
}
}
}
void sampler_texdim(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) {
DWORD sampler = state - STATE_SAMPLER(0);
DWORD mapped_stage = stateblock->wineD3DDevice->texUnitMap[sampler];
/* No need to enable / disable anything here for unused samplers. The tex_colorop
* handler takes care. Also no action is needed with pixel shaders, or if tex_colorop
* will take care of this business
*/
if(mapped_stage == -1 || mapped_stage >= GL_LIMITS(textures)) return;
if(sampler >= stateblock->lowest_disabled_stage) return;
if(use_ps(stateblock->wineD3DDevice)) return;
if(isStateDirty(context, STATE_TEXTURESTAGE(sampler, WINED3DTSS_COLOROP))) return;
texture_activate_dimensions(sampler, stateblock, context);
}
#undef GLINFO_LOCATION
......@@ -1733,6 +1733,7 @@ void set_tex_op(IWineD3DDevice *iface, BOOL isAlpha, int Stage, WINED3DTEXTURE
void set_tex_op_nvrc(IWineD3DDevice *iface, BOOL is_alpha, int stage, WINED3DTEXTUREOP op, DWORD arg1, DWORD arg2, DWORD arg3, INT texture_idx, DWORD dst);
void set_texture_matrix(const float *smat, DWORD flags, BOOL calculatedCoords, BOOL transformed, DWORD coordtype);
void texture_activate_dimensions(DWORD stage, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context);
void sampler_texdim(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context);
void surface_set_compatible_renderbuffer(IWineD3DSurface *iface, unsigned int width, unsigned int height);
GLenum surface_get_gl_buffer(IWineD3DSurface *iface, IWineD3DSwapChain *swapchain);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment