Browse Source

Fix re-creating of textures.
Safer clear of render to textures.

aignacio_sf 17 years ago
parent
commit
e3cd187cef
1 changed files with 28 additions and 5 deletions
  1. 28 5
      panda/src/dxgsg9/dxTextureContext9.cxx

+ 28 - 5
panda/src/dxgsg9/dxTextureContext9.cxx

@@ -85,6 +85,7 @@ evict_lru() {
 
   dequeue_lru();
   delete_texture();
+
   update_data_size_bytes(0);
   mark_unloaded();
 }
@@ -101,17 +102,22 @@ evict_lru() {
 ////////////////////////////////////////////////////////////////////
 bool DXTextureContext9::
 create_texture(DXScreenData &scrn) {
+
+  // check if the texture has already been created
+  if (_d3d_2d_texture || _d3d_cube_texture || _d3d_volume_texture) {
+    // texture already created, no need to create
+    return true;
+  }
+
   HRESULT hr;
   int num_alpha_bits;     //  number of alpha bits in texture pixfmt
   D3DFORMAT target_pixel_format = D3DFMT_UNKNOWN;
   bool needs_luminance = false;
   bool compress_texture = false;
-  
+
   Texture *tex = get_texture();
   nassertr(IS_VALID_PTR(tex), false);
 
-  delete_texture();
-
   // bpp indicates requested fmt, not texture fmt
   DWORD target_bpp = get_bits_per_pixel(tex->get_format(), &num_alpha_bits);
   DWORD num_color_channels = tex->get_num_components();
@@ -1167,7 +1173,7 @@ extract_texture_data() {
     hr = _d3d_2d_texture->LockRect(n, &rect, NULL, D3DLOCK_READONLY);
     if (FAILED(hr)) {
       dxgsg9_cat.error()
-        << "Texture::LockRect() failed!" << D3DERRORSTRING(hr);
+        << "Texture::LockRect() failed!  level = " << n << " " << D3DERRORSTRING(hr);
       return false;
     }
     
@@ -1664,6 +1670,18 @@ fill_d3d_texture_pixels(DXScreenData &scrn) {
             IDirect3DSurface9 *current_render_target;
 
             if (device -> GetRenderTarget (0, &current_render_target) == D3D_OK) {
+              IDirect3DSurface9 *depth_stencil_surface;
+
+              // turn off depth stencil when clearing texture if it exists
+              if (device -> GetDepthStencilSurface (&depth_stencil_surface) == D3D_OK) {
+                if (device -> SetDepthStencilSurface (NULL) == D3D_OK) {
+      
+                }
+              }
+              else {
+                depth_stencil_surface = 0;
+              }
+
               if (device -> SetRenderTarget (0, surface)  == D3D_OK) {
                 DWORD flags;
                 D3DCOLOR color;
@@ -1674,6 +1692,12 @@ fill_d3d_texture_pixels(DXScreenData &scrn) {
                 }
               }
 
+              // restore depth stencil 
+              if (depth_stencil_surface) {
+                depth_stencil_surface -> Release();
+              }
+
+              // restore render target
               device -> SetRenderTarget (0, current_render_target);
               current_render_target -> Release();
             }
@@ -2041,4 +2065,3 @@ get_bits_per_pixel(Texture::Format format, int *alphbits) {
   }
   return 8;
 }
-