2008/8/22 Stefan Dösinger stefan@codeweavers.com:
glGetIntegerv(GL_MAX_TEXTURE_COORDS, &gl_max);
gl_info->max_texture_coords = min(MAX_TEXTURES, gl_max);
TRACE_(d3d_caps)("Max texture coords: %d\n", gl_info->max_texture_coords);
I don't know if this is intentional or not, but did you mean to use gl_info->max_textures here?
@@ -3172,7 +3172,7 @@ static void loadTexCoords(IWineD3DStateBlockImpl *stateblock, WineDirect3DVertex return; }
- for (textureNo = 0; textureNo < GL_LIMITS(texture_stages); ++textureNo) {
for (textureNo = 0; textureNo < GL_LIMITS(texture_coords); ++textureNo) { int coordIdx = stateblock->textureState[textureNo][WINED3DTSS_TEXCOORDINDEX];
mapped_stage = stateblock->wineD3DDevice->texUnitMap[textureNo];
Shouldn't that be testing mapped_stage against GL_LIMITS(texture_coords) instead?
- if (GL_SUPPORT(NV_REGISTER_COMBINERS)) {
/* The number of the mapped stages increases monotonically, so it's fine to use the last used one */
for (textureNo = mapped_stage + 1; textureNo < GL_LIMITS(textures); ++textureNo) {
GL_EXTCALL(glMultiTexCoord4fARB(GL_TEXTURE0_ARB + textureNo, 0, 0, 0, 1));
}
- }
I'm probably missing something here, but why is it safe to remove that?
@@ -420,7 +420,7 @@ static void drawStridedSlow(IWineD3DDevice *iface, WineDirect3DVertexStridedData }
/* Texture coords --------------------------- */
for (textureNo = 0; textureNo < GL_LIMITS(texture_stages); ++textureNo) {
for (textureNo = 0; textureNo < GL_LIMITS(texture_coords); ++textureNo) { if (!GL_SUPPORT(ARB_MULTITEXTURE) && textureNo > 0) { FIXME("Program using multiple concurrent textures which this opengl implementation doesn't support\n");
Similar to above, shouldn't this test texture_idx against GL_LIMITS(texture_coords) instead of textureNo?
In the bigger picture, these various limits are pretty tricky to get right, I wonder if it might make more sense to handle most of this stuff in the tex unit map instead. That way we could be sure that if a stage is mapped to a sampler that sampler is safe to use.