Stefan Dösinger : wined3d: Move the dummy texture creation to the device.

Alexandre Julliard julliard at winehq.org
Tue Feb 26 05:45:22 CST 2008


Module: wine
Branch: master
Commit: 220d9eb44ca42eb289ef9de7cc49cf78e2b0140a
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=220d9eb44ca42eb289ef9de7cc49cf78e2b0140a

Author: Stefan Dösinger <stefan at codeweavers.com>
Date:   Fri Feb 15 15:54:37 2008 +0100

wined3d: Move the dummy texture creation to the device.

---

 dlls/wined3d/device.c     |   52 ++++++++++++++++++++++++++++++++++++++++++++-
 dlls/wined3d/stateblock.c |   46 +--------------------------------------
 2 files changed, 52 insertions(+), 46 deletions(-)

diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index efe8d9e..d1ab9a3 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -1923,6 +1923,54 @@ static void IWineD3DDeviceImpl_LoadLogo(IWineD3DDeviceImpl *This, const char *fi
     return;
 }
 
+static void create_dummy_textures(IWineD3DDeviceImpl *This) {
+    unsigned int i;
+    /* Under DirectX you can have texture stage operations even if no texture is
+    bound, whereas opengl will only do texture operations when a valid texture is
+    bound. We emulate this by creating dummy textures and binding them to each
+    texture stage, but disable all stages by default. Hence if a stage is enabled
+    then the default texture will kick in until replaced by a SetTexture call     */
+    ENTER_GL();
+
+    if(GL_SUPPORT(APPLE_CLIENT_STORAGE)) {
+        /* The dummy texture does not have client storage backing */
+        glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, GL_FALSE);
+        checkGLcall("glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, GL_FALSE)");
+    }
+    for (i = 0; i < GL_LIMITS(textures); i++) {
+        GLubyte white = 255;
+
+        /* Make appropriate texture active */
+        if (GL_SUPPORT(ARB_MULTITEXTURE)) {
+            GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + i));
+            checkGLcall("glActiveTextureARB");
+        } else if (i > 0) {
+            FIXME("Program using multiple concurrent textures which this opengl implementation doesn't support\n");
+        }
+
+        /* Generate an opengl texture name */
+        glGenTextures(1, &This->dummyTextureName[i]);
+        checkGLcall("glGenTextures");
+        TRACE("Dummy Texture %d given name %d\n", i, This->dummyTextureName[i]);
+
+        /* Generate a dummy 2d texture (not using 1d because they cause many
+        * DRI drivers fall back to sw) */
+        This->stateBlock->textureDimensions[i] = GL_TEXTURE_2D;
+        glBindTexture(GL_TEXTURE_2D, This->dummyTextureName[i]);
+        checkGLcall("glBindTexture");
+
+        glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 1, 1, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, &white);
+        checkGLcall("glTexImage2D");
+    }
+    if(GL_SUPPORT(APPLE_CLIENT_STORAGE)) {
+        /* Reenable because if supported it is enabled by default */
+        glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, GL_TRUE);
+        checkGLcall("glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, GL_TRUE)");
+    }
+
+    LEAVE_GL();
+}
+
 static HRESULT WINAPI IWineD3DDeviceImpl_Init3D(IWineD3DDevice *iface, WINED3DPRESENT_PARAMETERS* pPresentationParameters, D3DCB_CREATEADDITIONALSWAPCHAIN D3DCB_CreateAdditionalSwapChain) {
     IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *) iface;
     IWineD3DSwapChainImpl *swapchain = NULL;
@@ -2009,6 +2057,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Init3D(IWineD3DDevice *iface, WINED3DPR
 
     /* Setup all the devices defaults */
     IWineD3DStateBlock_InitStartupStateBlock((IWineD3DStateBlock *)This->stateBlock);
+    create_dummy_textures(This);
 #if 0
     IWineD3DImpl_CheckGraphicsMemory();
 #endif
@@ -6883,7 +6932,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Reset(IWineD3DDevice* iface, WINED3DPRE
     This->shader_backend->shader_destroy_depth_blt(iface);
 
     for (i = 0; i < GL_LIMITS(textures); i++) {
-        /* The stateblock initialization below will recreate them */
+        /* Textures are recreated below */
         glDeleteTextures(1, &This->dummyTextureName[i]);
         checkGLcall("glDeleteTextures(1, &This->dummyTextureName[i])");
         This->dummyTextureName[i] = 0;
@@ -6989,6 +7038,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Reset(IWineD3DDevice* iface, WINED3DPRE
     if(FAILED(hr)) {
         ERR("Resetting the stateblock failed with error 0x%08x\n", hr);
     }
+    create_dummy_textures(This);
 
     /* All done. There is no need to reload resources or shaders, this will happen automatically on the
      * first use
diff --git a/dlls/wined3d/stateblock.c b/dlls/wined3d/stateblock.c
index e0a40af..0c7edad 100644
--- a/dlls/wined3d/stateblock.c
+++ b/dlls/wined3d/stateblock.c
@@ -1234,56 +1234,12 @@ static HRESULT  WINAPI IWineD3DStateBlockImpl_InitStartupStateBlock(IWineD3DStat
         This->samplerState[i][WINED3DSAMP_DMAPOFFSET       ] = 0; /* TODO: Vertex offset in the presampled displacement map */
     }
 
-    /* Under DirectX you can have texture stage operations even if no texture is
-       bound, whereas opengl will only do texture operations when a valid texture is
-       bound. We emulate this by creating dummy textures and binding them to each
-       texture stage, but disable all stages by default. Hence if a stage is enabled
-       then the default texture will kick in until replaced by a SetTexture call     */
-    ENTER_GL();
-
-    if(GL_SUPPORT(APPLE_CLIENT_STORAGE)) {
-        /* The dummy texture does not have client storage backing */
-        glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, GL_FALSE);
-        checkGLcall("glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, GL_FALSE)");
-    }
-    for (i = 0; i < GL_LIMITS(textures); i++) {
-        GLubyte white = 255;
-
+    for(i = 0; i < GL_LIMITS(textures); i++) {
         /* Note this avoids calling settexture, so pretend it has been called */
         This->changed.textures[i] = TRUE;
         This->textures[i]         = NULL;
-
-        /* Make appropriate texture active */
-        if (GL_SUPPORT(ARB_MULTITEXTURE)) {
-            GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + i));
-            checkGLcall("glActiveTextureARB");
-        } else if (i > 0) {
-            FIXME("Program using multiple concurrent textures which this opengl implementation doesn't support\n");
-        }
-
-        /* Generate an opengl texture name */
-        glGenTextures(1, &ThisDevice->dummyTextureName[i]);
-        checkGLcall("glGenTextures");
-        TRACE("Dummy Texture %d given name %d\n", i, ThisDevice->dummyTextureName[i]);
-
-        /* Generate a dummy 2d texture (not using 1d because they cause many
-         * DRI drivers fall back to sw) */
-        This->textureDimensions[i] = GL_TEXTURE_2D;
-        glBindTexture(GL_TEXTURE_2D, ThisDevice->dummyTextureName[i]);
-        checkGLcall("glBindTexture");
-
-        glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 1, 1, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, &white);
-        checkGLcall("glTexImage2D");
-    }
-    if(GL_SUPPORT(APPLE_CLIENT_STORAGE)) {
-        /* Reenable because if supported it is enabled by default */
-        glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, GL_TRUE);
-        checkGLcall("glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, GL_TRUE)");
     }
 
-    LEAVE_GL();
-
-
     /* Defaulting palettes - Note these are device wide but reinitialized here for convenience*/
     for (i = 0; i < MAX_PALETTES; ++i) {
       int j;




More information about the wine-cvs mailing list