H. Verbeet : wined3d:
Load texture coordinates even if no texture is bound to that stage at
this time .
Alexandre Julliard
julliard at wine.codeweavers.com
Thu May 10 07:49:57 CDT 2007
Module: wine
Branch: master
Commit: 79ca4e022d593ec6106bad1e1ffde7b8c31ad01b
URL: http://source.winehq.org/git/wine.git/?a=commit;h=79ca4e022d593ec6106bad1e1ffde7b8c31ad01b
Author: H. Verbeet <hverbeet at gmail.com>
Date: Wed May 9 19:08:27 2007 +0200
wined3d: Load texture coordinates even if no texture is bound to that stage at this time.
---
dlls/wined3d/state.c | 63 +++++++++++++++++++++++---------------------------
1 files changed, 29 insertions(+), 34 deletions(-)
diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c
index c0643a2..ba25501 100644
--- a/dlls/wined3d/state.c
+++ b/dlls/wined3d/state.c
@@ -1825,46 +1825,41 @@ static void loadTexCoords(IWineD3DStateBlockImpl *stateblock, WineDirect3DVertex
unsigned int mapped_stage = 0;
unsigned int textureNo = 0;
+ /* The code below uses glClientActiveTexture and glMultiTexCoord* which are all part of the GL_ARB_multitexture extension. */
+ /* Abort if we don't support the extension. */
+ if (!GL_SUPPORT(ARB_MULTITEXTURE)) {
+ FIXME("Program using multiple concurrent textures which this opengl implementation doesn't support\n");
+ return;
+ }
+
for (textureNo = 0; textureNo < GL_LIMITS(texture_stages); ++textureNo) {
- /* The code below uses glClientActiveTexture and glMultiTexCoord* which are all part of the GL_ARB_multitexture extension. */
- /* Abort if we don't support the extension. */
- if (!GL_SUPPORT(ARB_MULTITEXTURE)) {
- FIXME("Program using multiple concurrent textures which this opengl implementation doesn't support\n");
- continue;
- }
+ int coordIdx = stateblock->textureState[textureNo][WINED3DTSS_TEXCOORDINDEX];
- if (stateblock->textures[textureNo]) {
- int coordIdx = stateblock->textureState[textureNo][WINED3DTSS_TEXCOORDINDEX];
+ mapped_stage = stateblock->wineD3DDevice->texUnitMap[textureNo];
+ if (mapped_stage == -1) continue;
+
+ if (coordIdx < MAX_TEXTURES && (sd->u.s.texCoords[coordIdx].lpData || sd->u.s.texCoords[coordIdx].VBO)) {
+ TRACE("Setting up texture %u, idx %d, cordindx %u, data %p\n",
+ textureNo, mapped_stage, coordIdx, sd->u.s.texCoords[coordIdx].lpData);
+
+ if (*curVBO != sd->u.s.texCoords[coordIdx].VBO) {
+ GL_EXTCALL(glBindBufferARB(GL_ARRAY_BUFFER_ARB, sd->u.s.texCoords[coordIdx].VBO));
+ checkGLcall("glBindBufferARB");
+ *curVBO = sd->u.s.texCoords[coordIdx].VBO;
+ }
- mapped_stage = stateblock->wineD3DDevice->texUnitMap[textureNo];
- /* The gl texture unit will never be -1 for a bound texture */
GL_EXTCALL(glClientActiveTextureARB(GL_TEXTURE0_ARB + mapped_stage));
checkGLcall("glClientActiveTextureARB");
- if (coordIdx >= MAX_TEXTURES) {
- VTRACE(("tex: %d - Skip tex coords, as being system generated\n", textureNo));
- GL_EXTCALL(glMultiTexCoord4fARB(GL_TEXTURE0_ARB + mapped_stage, 0, 0, 0, 1));
- } else if (sd->u.s.texCoords[coordIdx].lpData == NULL && sd->u.s.texCoords[coordIdx].VBO == 0) {
- VTRACE(("Bound texture but no texture coordinates supplied, so skipping\n"));
- GL_EXTCALL(glMultiTexCoord4fARB(GL_TEXTURE0_ARB + mapped_stage, 0, 0, 0, 1));
- } else {
- TRACE("Setting up texture %u, idx %d, cordindx %u, data %p\n",
- textureNo, mapped_stage, coordIdx, sd->u.s.texCoords[coordIdx].lpData);
- if (*curVBO != sd->u.s.texCoords[coordIdx].VBO) {
- GL_EXTCALL(glBindBufferARB(GL_ARRAY_BUFFER_ARB, sd->u.s.texCoords[coordIdx].VBO));
- checkGLcall("glBindBufferARB");
- *curVBO = sd->u.s.texCoords[coordIdx].VBO;
- }
- /* The coords to supply depend completely on the fvf / vertex shader */
- glTexCoordPointer(
- WINED3D_ATR_SIZE(sd->u.s.texCoords[coordIdx].dwType),
- WINED3D_ATR_GLTYPE(sd->u.s.texCoords[coordIdx].dwType),
- sd->u.s.texCoords[coordIdx].dwStride,
- sd->u.s.texCoords[coordIdx].lpData + stateblock->loadBaseVertexIndex * sd->u.s.texCoords[coordIdx].dwStride + offset[sd->u.s.texCoords[coordIdx].streamNo]);
- glEnableClientState(GL_TEXTURE_COORD_ARRAY);
- }
- } else if (!GL_SUPPORT(NV_REGISTER_COMBINERS)) {
- GL_EXTCALL(glMultiTexCoord4fARB(GL_TEXTURE0_ARB + textureNo, 0, 0, 0, 1));
+ /* The coords to supply depend completely on the fvf / vertex shader */
+ glTexCoordPointer(
+ WINED3D_ATR_SIZE(sd->u.s.texCoords[coordIdx].dwType),
+ WINED3D_ATR_GLTYPE(sd->u.s.texCoords[coordIdx].dwType),
+ sd->u.s.texCoords[coordIdx].dwStride,
+ sd->u.s.texCoords[coordIdx].lpData + stateblock->loadBaseVertexIndex * sd->u.s.texCoords[coordIdx].dwStride + offset[sd->u.s.texCoords[coordIdx].streamNo]);
+ glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+ } else {
+ GL_EXTCALL(glMultiTexCoord4fARB(GL_TEXTURE0_ARB + mapped_stage, 0, 0, 0, 1));
}
}
if (GL_SUPPORT(NV_REGISTER_COMBINERS)) {
More information about the wine-cvs
mailing list