From 48c8200ed3b908378b5d7cdfe5db2274fea622f2 Mon Sep 17 00:00:00 2001 From: bkaradzic Date: Tue, 1 May 2012 20:16:59 -0700 Subject: [PATCH] Fixed issue with decompressing DDS. --- src/dds.cpp | 2 ++ src/renderer_d3d9.cpp | 15 ++++++++++++--- src/renderer_gl.cpp | 16 +++++++++------- 3 files changed, 23 insertions(+), 10 deletions(-) diff --git a/src/dds.cpp b/src/dds.cpp index 9e92cf2b3..ef524c8f8 100644 --- a/src/dds.cpp +++ b/src/dds.cpp @@ -423,10 +423,12 @@ bool parseDds(Dds& _dds, const Memory* _mem) { case DDPF_RGB: blockSize *= 3; + bpp = 3; break; case DDPF_RGB|DDPF_ALPHAPIXELS: blockSize *= 4; + bpp = 4; break; case DDPF_LUMINANCE: diff --git a/src/renderer_d3d9.cpp b/src/renderer_d3d9.cpp index 21de214e0..a8df8eac3 100644 --- a/src/renderer_d3d9.cpp +++ b/src/renderer_d3d9.cpp @@ -182,6 +182,8 @@ namespace bgfx BGFX_FATAL(m_device, bgfx::Fatal::D3D9_UnableToCreateDevice, "Unable to create Direct3D9 device."); + DX_CHECK(m_device->GetDeviceCaps(&m_caps) ); + m_fmtNULL = SUCCEEDED(m_d3d9->CheckDeviceFormat(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_TEXTURE, D3DFMT_NULL) ); m_fmtDF16 = SUCCEEDED(m_d3d9->CheckDeviceFormat(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_TEXTURE, D3DFMT_DF16) ); m_fmtDF24 = SUCCEEDED(m_d3d9->CheckDeviceFormat(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_TEXTURE, D3DFMT_DF24) ); @@ -466,6 +468,8 @@ namespace bgfx } #if BX_PLATFORM_WINDOWS + D3DCAPS9 m_caps; + D3DPERF_SetMarkerFunc m_D3DPERF_SetMarker; D3DPERF_BeginEventFunc m_D3DPERF_BeginEvent; D3DPERF_EndEventFunc m_D3DPERF_EndEvent; @@ -846,9 +850,9 @@ namespace bgfx D3DFORMAT fmt = typefmt[dds.m_type]; bool decompress = false; + uint8_t bpp = dds.m_bpp; - if (decompress - || (0 == dds.m_type) ) + if (0 == dds.m_type) { switch (dds.m_bpp) { @@ -865,6 +869,11 @@ namespace bgfx break; } } + else if (decompress) + { + fmt = D3DFMT_A8R8G8B8; + bpp = 4; + } DX_CHECK(s_renderCtx.m_device->CreateTexture(dds.m_width , dds.m_height @@ -897,7 +906,7 @@ namespace bgfx if (width != mip.m_width || height != mip.m_height) { - uint32_t srcpitch = mip.m_width*mip.m_bpp; + uint32_t srcpitch = mip.m_width*bpp; uint8_t* temp = (uint8_t*)g_realloc(NULL, srcpitch*mip.m_height); mip.decode(temp); diff --git a/src/renderer_gl.cpp b/src/renderer_gl.cpp index 5a6767af6..70afe1090 100644 --- a/src/renderer_gl.cpp +++ b/src/renderer_gl.cpp @@ -631,11 +631,16 @@ namespace bgfx { fmt = s_extension[Extension::GL_EXT_texture_format_BGRA8888].m_supported ? GL_BGRA_EXT : GL_RGBA; - if (dds.m_bpp == 1) + uint8_t bpp = 4; + if (dds.m_type == 0 + && dds.m_bpp == 1) { fmt = GL_LUMINANCE; + bpp = 1; } + uint8_t* bits = (uint8_t*)g_realloc(NULL, dds.m_width*dds.m_height*bpp); + for (uint32_t lod = 0, num = dds.m_numMips; lod < num; ++lod) { width = uint32_max(1, width); @@ -644,9 +649,6 @@ namespace bgfx Mip mip; if (getRawImageData(dds, lod, _mem, mip) ) { - uint32_t srcpitch = mip.m_width*mip.m_bpp; - uint8_t* bits = (uint8_t*)g_realloc(NULL, srcpitch*mip.m_height); - mip.decode(bits); if (GL_RGBA == fmt) @@ -676,13 +678,13 @@ namespace bgfx , GL_UNSIGNED_BYTE , bits ) ); - - g_free(bits); } width >>= 1; height >>= 1; } + + g_free(bits); } else { @@ -1139,7 +1141,7 @@ namespace bgfx pos += len+1; } - s_renderCtx.m_dxtSupport = false //true + s_renderCtx.m_dxtSupport = true && s_extension[Extension::GL_EXT_texture_compression_dxt1].m_supported && s_extension[Extension::GL_CHROMIUM_texture_compression_dxt3].m_supported && s_extension[Extension::GL_CHROMIUM_texture_compression_dxt5].m_supported