瀏覽代碼

Fix always compresing textures bug.

aignacio_sf 18 年之前
父節點
當前提交
29681b41f6
共有 1 個文件被更改,包括 32 次插入20 次删除
  1. 32 20
      panda/src/dxgsg9/dxTextureContext9.cxx

+ 32 - 20
panda/src/dxgsg9/dxTextureContext9.cxx

@@ -148,16 +148,34 @@ create_texture(DXScreenData &scrn) {
   Texture::CompressionMode compression_mode = Texture::CompressionMode::CM_off;
   Texture::CompressionMode compression_mode = Texture::CompressionMode::CM_off;
   bool texture_stored_compressed = false;
   bool texture_stored_compressed = false;
   bool texture_wants_compressed = false;
   bool texture_wants_compressed = false;
+
+  compression_mode = get_texture()->get_ram_image_compression();
+  // assert my assumption that CM_dxt1..CM_dxt5 enum values are ascending without gaps
+  nassertr(((Texture::CompressionMode::CM_dxt1+1)==Texture::CompressionMode::CM_dxt2)&&((Texture::CompressionMode::CM_dxt2+1)==Texture::CompressionMode::CM_dxt3)&&((Texture::CompressionMode::CM_dxt3+1)==Texture::CompressionMode::CM_dxt4)&&((Texture::CompressionMode::CM_dxt4+1)==Texture::CompressionMode::CM_dxt5),false);
+  if ((compression_mode >= Texture::CompressionMode::CM_dxt1) && (compression_mode <= Texture::CompressionMode::CM_dxt5)) {
+    texture_stored_compressed = true;
+  }
   
   
-  if (get_texture()->get_compression() != Texture::CompressionMode::CM_off) {
-    texture_wants_compressed = true;
-    compression_mode = get_texture()->get_ram_image_compression();
-    // assert my assumption that CM_dxt1..CM_dxt5 enum values are ascending without gaps
-    nassertr(((Texture::CompressionMode::CM_dxt1+1)==Texture::CompressionMode::CM_dxt2)&&((Texture::CompressionMode::CM_dxt2+1)==Texture::CompressionMode::CM_dxt3)&&((Texture::CompressionMode::CM_dxt3+1)==Texture::CompressionMode::CM_dxt4)&&((Texture::CompressionMode::CM_dxt4+1)==Texture::CompressionMode::CM_dxt5),false);
-    if ((compression_mode >= Texture::CompressionMode::CM_dxt1) && (compression_mode <= Texture::CompressionMode::CM_dxt5)) {
-      texture_stored_compressed = true;
+  if (texture_stored_compressed) {
+    texture_wants_compressed = true;  
+  }
+  else {
+    if (get_texture()->get_compression() == Texture::CompressionMode::CM_off) {
+      // no compression
     }
     }
+    else {    
+      if (get_texture()->get_compression() == Texture::CompressionMode::CM_default) {
+        // default = use "compressed-textures" config setting
+        if (compressed_textures) {
+          texture_wants_compressed = true;
+        }
+      }
+      else {
+        texture_wants_compressed = true;
+      }
+    }  
   }
   }
+    
   switch (get_texture()->get_texture_type()) {
   switch (get_texture()->get_texture_type()) {
     case Texture::TT_1d_texture:
     case Texture::TT_1d_texture:
     case Texture::TT_2d_texture:
     case Texture::TT_2d_texture:
@@ -172,7 +190,7 @@ create_texture(DXScreenData &scrn) {
       }
       }
       break;
       break;
     case Texture::TT_3d_texture:
     case Texture::TT_3d_texture:
-      // not supported by all video chips
+      // compression of 3d textures not supported by all video chips
       break;
       break;
   }
   }
   
   
@@ -856,7 +874,7 @@ create_texture(DXScreenData &scrn) {
     data_size *= 6;
     data_size *= 6;
   }
   }
   update_data_size_bytes(data_size);
   update_data_size_bytes(data_size);
-
+  
   int attempts;
   int attempts;
 
 
   attempts = 0;
   attempts = 0;
@@ -868,15 +886,7 @@ create_texture(DXScreenData &scrn) {
       hr = scrn._d3d_device->CreateTexture
       hr = scrn._d3d_device->CreateTexture
         (target_width, target_height, mip_level_count, usage,
         (target_width, target_height, mip_level_count, usage,
          target_pixel_format, pool, &_d3d_2d_texture, NULL);
          target_pixel_format, pool, &_d3d_2d_texture, NULL);
-      _d3d_texture = _d3d_2d_texture;
-      
-/* DEBUG      
-if (get_texture()->get_render_to_texture ( )) {
-  printf ("dtc %p \n", this);
-  printf ("_d3d_2d_texture %p \n", _d3d_2d_texture);
-//  __debugbreak();
-}
-*/
+      _d3d_texture = _d3d_2d_texture;      
       break;
       break;
 
 
     case Texture::TT_3d_texture:
     case Texture::TT_3d_texture:
@@ -899,7 +909,6 @@ if (get_texture()->get_render_to_texture ( )) {
     attempts++;
     attempts++;
   }
   }
   while (scrn._dxgsg9 -> check_dx_allocation (hr, data_size, attempts));
   while (scrn._dxgsg9 -> check_dx_allocation (hr, data_size, attempts));
-
   if (FAILED(hr)) {
   if (FAILED(hr)) {
     dxgsg9_cat.error()
     dxgsg9_cat.error()
       << "D3D create_texture failed!" << D3DERRORSTRING(hr);
       << "D3D create_texture failed!" << D3DERRORSTRING(hr);
@@ -949,7 +958,7 @@ if (get_texture()->get_render_to_texture ( )) {
     get_texture()->texture_uploaded();
     get_texture()->texture_uploaded();
   }
   }
   mark_loaded();
   mark_loaded();
-
+  
   return true;
   return true;
 
 
  error_exit:
  error_exit:
@@ -1410,6 +1419,7 @@ fill_d3d_texture_pixels(bool supports_automatic_mipmap_generation) {
   nassertr(IS_VALID_PTR(get_texture()), E_FAIL);
   nassertr(IS_VALID_PTR(get_texture()), E_FAIL);
 
 
   CPTA_uchar image = get_texture()->get_ram_image();
   CPTA_uchar image = get_texture()->get_ram_image();
+  
   if (image.is_null()) {
   if (image.is_null()) {
     // The texture doesn't have an image to load.  That's ok; it
     // The texture doesn't have an image to load.  That's ok; it
     // might be a texture we've rendered to by frame buffer
     // might be a texture we've rendered to by frame buffer
@@ -1504,6 +1514,7 @@ fill_d3d_texture_pixels(bool supports_automatic_mipmap_generation) {
           // mip_filter_flags |= D3DX_FILTER_DITHER;
           // mip_filter_flags |= D3DX_FILTER_DITHER;
           hr = D3DXFilterTexture(_d3d_texture, (PALETTEENTRY*)NULL, 0,
           hr = D3DXFilterTexture(_d3d_texture, (PALETTEENTRY*)NULL, 0,
                                 mip_filter_flags);
                                 mip_filter_flags);
+
           if (FAILED(hr)) {
           if (FAILED(hr)) {
             dxgsg9_cat.error()
             dxgsg9_cat.error()
               << "FillDDSurfaceTexturePixels failed for " << get_texture()->get_name()
               << "FillDDSurfaceTexturePixels failed for " << get_texture()->get_name()
@@ -1513,6 +1524,7 @@ fill_d3d_texture_pixels(bool supports_automatic_mipmap_generation) {
       }
       }
     }
     }
   }
   }
+
   return hr;
   return hr;
 }
 }