wined3d: Fall back to drawStridedSlow if fog coords are used.
This commit is contained in:
parent
e2605fb0ed
commit
98bc83be7c
|
@ -1050,13 +1050,22 @@ void drawPrimitive(IWineD3DDevice *iface,
|
||||||
if (numberOfVertices == 0 )
|
if (numberOfVertices == 0 )
|
||||||
numberOfVertices = calculatedNumberOfindices;
|
numberOfVertices = calculatedNumberOfindices;
|
||||||
|
|
||||||
if(!This->strided_streams.u.s.position_transformed && !use_vs(This)) {
|
if(!use_vs(This)) {
|
||||||
if(This->activeContext->num_untracked_materials &&
|
if(!This->strided_streams.u.s.position_transformed && This->activeContext->num_untracked_materials &&
|
||||||
This->stateBlock->renderState[WINED3DRS_LIGHTING]) {
|
This->stateBlock->renderState[WINED3DRS_LIGHTING]) {
|
||||||
IWineD3DVertexBufferImpl *vb;
|
|
||||||
|
|
||||||
FIXME("Using software emulation because not all material properties could be tracked\n");
|
FIXME("Using software emulation because not all material properties could be tracked\n");
|
||||||
emulation = TRUE;
|
emulation = TRUE;
|
||||||
|
}
|
||||||
|
else if(This->activeContext->fog_coord && This->stateBlock->renderState[WINED3DRS_FOGENABLE]) {
|
||||||
|
/* Either write a pipeline replacement shader or convert the specular alpha from unsigned byte
|
||||||
|
* to a float in the vertex buffer
|
||||||
|
*/
|
||||||
|
FIXME("Using software emulation because manual fog coordinates are provided\n");
|
||||||
|
emulation = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(emulation) {
|
||||||
|
IWineD3DVertexBufferImpl *vb;
|
||||||
|
|
||||||
strided = &stridedlcl;
|
strided = &stridedlcl;
|
||||||
memcpy(&stridedlcl, &This->strided_streams, sizeof(stridedlcl));
|
memcpy(&stridedlcl, &This->strided_streams, sizeof(stridedlcl));
|
||||||
|
|
|
@ -803,9 +803,10 @@ static void state_fog(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DCo
|
||||||
fogend = 0.0;
|
fogend = 0.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(GL_SUPPORT(EXT_FOG_COORD)) {
|
if(GL_SUPPORT(EXT_FOG_COORD) && context->fog_coord) {
|
||||||
glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT);
|
glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT);
|
||||||
checkGLcall("glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT");
|
checkGLcall("glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT");
|
||||||
|
context->fog_coord = FALSE;
|
||||||
}
|
}
|
||||||
context->last_was_foggy_shader = TRUE;
|
context->last_was_foggy_shader = TRUE;
|
||||||
}
|
}
|
||||||
|
@ -843,9 +844,10 @@ static void state_fog(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DCo
|
||||||
default: FIXME("Unexpected WINED3DRS_FOGVERTEXMODE %d\n", stateblock->renderState[WINED3DRS_FOGVERTEXMODE]);
|
default: FIXME("Unexpected WINED3DRS_FOGVERTEXMODE %d\n", stateblock->renderState[WINED3DRS_FOGVERTEXMODE]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(GL_SUPPORT(EXT_FOG_COORD)) {
|
if(GL_SUPPORT(EXT_FOG_COORD) && context->fog_coord) {
|
||||||
glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT);
|
glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT);
|
||||||
checkGLcall("glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT");
|
checkGLcall("glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT");
|
||||||
|
context->fog_coord = FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* DX 7 sdk: "If both render states(vertex and table fog) are set to valid modes,
|
/* DX 7 sdk: "If both render states(vertex and table fog) are set to valid modes,
|
||||||
|
@ -862,9 +864,10 @@ static void state_fog(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DCo
|
||||||
if(!context->last_was_rhw) {
|
if(!context->last_was_rhw) {
|
||||||
glFogi(GL_FOG_MODE, GL_EXP);
|
glFogi(GL_FOG_MODE, GL_EXP);
|
||||||
checkGLcall("glFogi(GL_FOG_MODE, GL_EXP");
|
checkGLcall("glFogi(GL_FOG_MODE, GL_EXP");
|
||||||
if(GL_SUPPORT(EXT_FOG_COORD)) {
|
if(GL_SUPPORT(EXT_FOG_COORD) && context->fog_coord) {
|
||||||
glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT);
|
glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT);
|
||||||
checkGLcall("glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT");
|
checkGLcall("glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT");
|
||||||
|
context->fog_coord = FALSE;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -873,9 +876,10 @@ static void state_fog(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DCo
|
||||||
if(!context->last_was_rhw) {
|
if(!context->last_was_rhw) {
|
||||||
glFogi(GL_FOG_MODE, GL_EXP2);
|
glFogi(GL_FOG_MODE, GL_EXP2);
|
||||||
checkGLcall("glFogi(GL_FOG_MODE, GL_EXP2");
|
checkGLcall("glFogi(GL_FOG_MODE, GL_EXP2");
|
||||||
if(GL_SUPPORT(EXT_FOG_COORD)) {
|
if(GL_SUPPORT(EXT_FOG_COORD) && context->fog_coord) {
|
||||||
glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT);
|
glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT);
|
||||||
checkGLcall("glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT");
|
checkGLcall("glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT");
|
||||||
|
context->fog_coord = FALSE;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -884,9 +888,10 @@ static void state_fog(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DCo
|
||||||
if(!context->last_was_rhw) {
|
if(!context->last_was_rhw) {
|
||||||
glFogi(GL_FOG_MODE, GL_LINEAR);
|
glFogi(GL_FOG_MODE, GL_LINEAR);
|
||||||
checkGLcall("glFogi(GL_FOG_MODE, GL_LINEAR");
|
checkGLcall("glFogi(GL_FOG_MODE, GL_LINEAR");
|
||||||
if(GL_SUPPORT(EXT_FOG_COORD)) {
|
if(GL_SUPPORT(EXT_FOG_COORD) && context->fog_coord) {
|
||||||
glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT);
|
glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT);
|
||||||
checkGLcall("glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT");
|
checkGLcall("glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT");
|
||||||
|
context->fog_coord = FALSE;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -897,8 +902,11 @@ static void state_fog(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DCo
|
||||||
* Same happens with Vertexfog on transformed vertices
|
* Same happens with Vertexfog on transformed vertices
|
||||||
*/
|
*/
|
||||||
if(GL_SUPPORT(EXT_FOG_COORD)) {
|
if(GL_SUPPORT(EXT_FOG_COORD)) {
|
||||||
glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FOG_COORDINATE_EXT);
|
if(context->fog_coord == FALSE) {
|
||||||
checkGLcall("glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FOG_COORDINATE_EXT)\n");
|
glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FOG_COORDINATE_EXT);
|
||||||
|
checkGLcall("glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FOG_COORDINATE_EXT)\n");
|
||||||
|
context->fog_coord = TRUE;
|
||||||
|
}
|
||||||
glFogi(GL_FOG_MODE, GL_LINEAR);
|
glFogi(GL_FOG_MODE, GL_LINEAR);
|
||||||
checkGLcall("glFogi(GL_FOG_MODE, GL_LINEAR)");
|
checkGLcall("glFogi(GL_FOG_MODE, GL_LINEAR)");
|
||||||
fogstart = 0xff;
|
fogstart = 0xff;
|
||||||
|
@ -920,27 +928,30 @@ static void state_fog(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DCo
|
||||||
case WINED3DFOG_EXP:
|
case WINED3DFOG_EXP:
|
||||||
glFogi(GL_FOG_MODE, GL_EXP);
|
glFogi(GL_FOG_MODE, GL_EXP);
|
||||||
checkGLcall("glFogi(GL_FOG_MODE, GL_EXP");
|
checkGLcall("glFogi(GL_FOG_MODE, GL_EXP");
|
||||||
if(GL_SUPPORT(EXT_FOG_COORD)) {
|
if(GL_SUPPORT(EXT_FOG_COORD) && context->fog_coord) {
|
||||||
glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT);
|
glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT);
|
||||||
checkGLcall("glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT");
|
checkGLcall("glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT");
|
||||||
|
context->fog_coord = FALSE;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WINED3DFOG_EXP2:
|
case WINED3DFOG_EXP2:
|
||||||
glFogi(GL_FOG_MODE, GL_EXP2);
|
glFogi(GL_FOG_MODE, GL_EXP2);
|
||||||
checkGLcall("glFogi(GL_FOG_MODE, GL_EXP2");
|
checkGLcall("glFogi(GL_FOG_MODE, GL_EXP2");
|
||||||
if(GL_SUPPORT(EXT_FOG_COORD)) {
|
if(GL_SUPPORT(EXT_FOG_COORD) && context->fog_coord) {
|
||||||
glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT);
|
glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT);
|
||||||
checkGLcall("glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT");
|
checkGLcall("glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT");
|
||||||
|
context->fog_coord = FALSE;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WINED3DFOG_LINEAR:
|
case WINED3DFOG_LINEAR:
|
||||||
glFogi(GL_FOG_MODE, GL_LINEAR);
|
glFogi(GL_FOG_MODE, GL_LINEAR);
|
||||||
checkGLcall("glFogi(GL_FOG_MODE, GL_LINEAR");
|
checkGLcall("glFogi(GL_FOG_MODE, GL_LINEAR");
|
||||||
if(GL_SUPPORT(EXT_FOG_COORD)) {
|
if(GL_SUPPORT(EXT_FOG_COORD) && context->fog_coord) {
|
||||||
glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT);
|
glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT);
|
||||||
checkGLcall("glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT");
|
checkGLcall("glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT");
|
||||||
|
context->fog_coord = FALSE;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
@ -518,6 +518,7 @@ struct WineD3DContext {
|
||||||
GLenum untracked_materials[2];
|
GLenum untracked_materials[2];
|
||||||
BOOL last_was_blit, last_was_ckey;
|
BOOL last_was_blit, last_was_ckey;
|
||||||
char texShaderBumpMap;
|
char texShaderBumpMap;
|
||||||
|
BOOL fog_coord;
|
||||||
|
|
||||||
/* The actual opengl context */
|
/* The actual opengl context */
|
||||||
HGLRC glCtx;
|
HGLRC glCtx;
|
||||||
|
|
Loading…
Reference in New Issue