From d7af989746283de57f842e2e3cdd17ac2764736a Mon Sep 17 00:00:00 2001 From: Arvastra Date: Wed, 18 Mar 2020 11:35:08 +0100 Subject: [PATCH] Tidying up. --- renderdoc/common/dds_readwrite.cpp | 2 +- renderdoc/common/dds_readwrite.h | 2 +- renderdoc/core/image_viewer.cpp | 10 +- renderdoc/os/win32/win32_shellext.cpp | 136 +++++--------------------- 4 files changed, 30 insertions(+), 120 deletions(-) diff --git a/renderdoc/common/dds_readwrite.cpp b/renderdoc/common/dds_readwrite.cpp index 9a2c76803..539c9e945 100644 --- a/renderdoc/common/dds_readwrite.cpp +++ b/renderdoc/common/dds_readwrite.cpp @@ -26,7 +26,7 @@ #include #include "common/common.h" #include "os/os_specific.h" -#include "serialise/zstdio.h" +#include "serialise/streamio.h" static const uint32_t dds_fourcc = MAKE_FOURCC('D', 'D', 'S', ' '); diff --git a/renderdoc/common/dds_readwrite.h b/renderdoc/common/dds_readwrite.h index c868a1d35..a6bc7d1a8 100644 --- a/renderdoc/common/dds_readwrite.h +++ b/renderdoc/common/dds_readwrite.h @@ -26,7 +26,7 @@ #include #include "api/replay/data_types.h" -#include "serialise/zstdio.h" +#include "serialise/streamio.h" struct dds_data { diff --git a/renderdoc/core/image_viewer.cpp b/renderdoc/core/image_viewer.cpp index 9774055de..9289b3dd0 100644 --- a/renderdoc/core/image_viewer.cpp +++ b/renderdoc/core/image_viewer.cpp @@ -399,10 +399,10 @@ ReplayStatus IMG_CreateReplayDevice(RDCFile *rdc, IReplayDriver **driver) FileIO::fseek64(f, 0, SEEK_SET); StreamReader reader(f); dds_data read_data = load_dds_from_file(&reader); + f = NULL; if(read_data.subdata == NULL) { - FileIO::fclose(f); RDCERR("DDS file recognised, but couldn't load"); return ReplayStatus::ImageUnsupported; } @@ -439,7 +439,8 @@ ReplayStatus IMG_CreateReplayDevice(RDCFile *rdc, IReplayDriver **driver) free(data); } - FileIO::fclose(f); + if(f != NULL) + FileIO::fclose(f); IReplayDriver *proxy = NULL; ReplayStatus status = RenderDoc::Inst().CreateProxyReplayDriver(RDCDriver::Unknown, &proxy); @@ -676,10 +677,10 @@ void ImageViewer::RefreshFile() FileIO::fseek64(f, 0, SEEK_SET); StreamReader reader(f); read_data = load_dds_from_file(&reader); + f = NULL; if(read_data.subdata == NULL) { - FileIO::fclose(f); return; } @@ -770,5 +771,6 @@ void ImageViewer::RefreshFile() delete[] read_data.subsizes; } - FileIO::fclose(f); + if(f != NULL) + FileIO::fclose(f); } diff --git a/renderdoc/os/win32/win32_shellext.cpp b/renderdoc/os/win32/win32_shellext.cpp index d13ebaa6c..4459770b2 100644 --- a/renderdoc/os/win32/win32_shellext.cpp +++ b/renderdoc/os/win32/win32_shellext.cpp @@ -126,25 +126,26 @@ struct RDCThumbnailProvider : public IThumbnailProvider, IInitializeWithStream if(is_dds_file(captureHeader.data(), numRead)) { - // Read File from beginning. Seek requires the struct LARGE_INTEGER. - LARGE_INTEGER zero; - zero.QuadPart = 0; - pstream->Seek(zero, STREAM_SEEK_SET, NULL); STATSTG stats = {}; pstream->Stat(&stats, STATFLAG_DEFAULT); - ULARGE_INTEGER size = stats.cbSize; - - byte *ddsFile = new byte[size.QuadPart]; + const uint32_t size = (uint32_t)stats.cbSize.QuadPart; + const uint32_t offset = 2 * 1024 * 1024; ULONG ddsNumRead = 0; - pstream->Read(ddsFile, static_cast(size.QuadPart), &ddsNumRead); - StreamReader reader(ddsFile, ddsNumRead); + + // read rest of file + if(size > captureHeader.size()) + { + captureHeader.resize(size); + pstream->Read(captureHeader.begin() + offset, (ULONG)(size - offset), &ddsNumRead); + } + + StreamReader reader(captureHeader.data(), (ULONG)size); m_ddsData = load_dds_from_file(&reader); if(m_ddsData.subdata == NULL) { delete[] m_ddsData.subdata; delete[] m_ddsData.subsizes; - delete[] ddsFile; return E_INVALIDARG; } // Ignore volume slices and mip maps. We want to convert the first slice of the image as @@ -154,7 +155,6 @@ struct RDCThumbnailProvider : public IThumbnailProvider, IInitializeWithStream m_Thumb.height = static_cast(m_ddsData.height); m_Thumb.width = static_cast(m_ddsData.width); m_Thumb.format = FileType::DDS; - delete[] ddsFile; } else { @@ -401,7 +401,7 @@ struct RDCThumbnailProvider : public IThumbnailProvider, IInitializeWithStream size_t thumblen = m_Thumb.len; uint32_t thumbwidth = m_Thumb.width, thumbheight = m_Thumb.height; - byte *thumbpixels = nullptr; + byte *thumbpixels = NULL; if(m_Thumb.format == FileType::JPG) { @@ -416,60 +416,12 @@ struct RDCThumbnailProvider : public IThumbnailProvider, IInitializeWithStream } else { - const ResourceFormatType compType = m_ddsData.format.type; + const ResourceFormatType resourceType = m_ddsData.format.type; const uint32_t decompressedStride = thumbwidth * 4; const uint32_t decompressedBlockWidth = 16; // in bytes (4 byte/pixel) const uint32_t decompressedBlockMaxSize = 64; + const uint32_t compressedBlockSize = m_ddsData.format.ElementSize(); - ResourceFormatType ddsFormatType = ResourceFormatType::BC1; - int compressedBlockSize = 8; - switch(compType) - { - case ResourceFormatType::BC1: - ddsFormatType = ResourceFormatType::BC1; - compressedBlockSize = 8; - break; - case ResourceFormatType::BC2: - ddsFormatType = ResourceFormatType::BC2; - compressedBlockSize = 16; - break; - case ResourceFormatType::BC3: - ddsFormatType = ResourceFormatType::BC3; - compressedBlockSize = 16; - break; - case ResourceFormatType::BC4: // red color only, 1 bytes/pixel - ddsFormatType = ResourceFormatType::BC4; - compressedBlockSize = 8; - break; - case ResourceFormatType::BC5: // red, green color only, 2 bytes/pixel - ddsFormatType = ResourceFormatType::BC5; - compressedBlockSize = 16; - break; - case ResourceFormatType::BC6: // other formats - case ResourceFormatType::BC7: - case ResourceFormatType::A8: - case ResourceFormatType::ASTC: - case ResourceFormatType::D16S8: - case ResourceFormatType::D24S8: - case ResourceFormatType::D32S8: - case ResourceFormatType::EAC: - case ResourceFormatType::ETC2: - case ResourceFormatType::PVRTC: - case ResourceFormatType::R10G10B10A2: - case ResourceFormatType::R11G11B10: - case ResourceFormatType::R4G4: - case ResourceFormatType::R4G4B4A4: - case ResourceFormatType::R5G5B5A1: - case ResourceFormatType::R5G6B5: - case ResourceFormatType::R9G9B9E5: - case ResourceFormatType::Regular: - case ResourceFormatType::S8: - case ResourceFormatType::Undefined: - case ResourceFormatType::YUV10: - case ResourceFormatType::YUV12: - case ResourceFormatType::YUV16: - case ResourceFormatType::YUV8: return E_NOTIMPL; - } thumbwidth = m_ddsData.width; thumbheight = m_ddsData.height; // Delete buffers @@ -481,14 +433,14 @@ struct RDCThumbnailProvider : public IThumbnailProvider, IInitializeWithStream unsigned char decompressedBlock[decompressedBlockMaxSize]; unsigned char greenBlock[16]; - auto compBlockStart = m_Thumb.pixels; + const byte *compBlockStart = m_Thumb.pixels; for(uint32_t blockY = 0; blockY < thumbheight / 4; blockY++) { for(uint32_t blockX = 0; blockX < thumbwidth / 4; blockX++) { uint32_t decompressedBlockStart = blockY * 4 * decompressedStride + blockX * decompressedBlockWidth; - switch(ddsFormatType) + switch(resourceType) { case ResourceFormatType::BC1: DecompressBlockBC1(compBlockStart, decompressedBlock, nullptr); @@ -505,37 +457,15 @@ struct RDCThumbnailProvider : public IThumbnailProvider, IInitializeWithStream case ResourceFormatType::BC5: DecompressBlockBC5(compBlockStart, decompressedBlock, greenBlock, nullptr); break; - case ResourceFormatType::BC6: // other formats - case ResourceFormatType::BC7: - case ResourceFormatType::A8: - case ResourceFormatType::ASTC: - case ResourceFormatType::D16S8: - case ResourceFormatType::D24S8: - case ResourceFormatType::D32S8: - case ResourceFormatType::EAC: - case ResourceFormatType::ETC2: - case ResourceFormatType::PVRTC: - case ResourceFormatType::R10G10B10A2: - case ResourceFormatType::R11G11B10: - case ResourceFormatType::R4G4: - case ResourceFormatType::R4G4B4A4: - case ResourceFormatType::R5G5B5A1: - case ResourceFormatType::R5G6B5: - case ResourceFormatType::R9G9B9E5: - case ResourceFormatType::Regular: - case ResourceFormatType::S8: - case ResourceFormatType::Undefined: - case ResourceFormatType::YUV10: - case ResourceFormatType::YUV12: - case ResourceFormatType::YUV16: - case ResourceFormatType::YUV8: return E_NOTIMPL; + default: + return E_NOTIMPL; // other formats } auto decompPointer = decompressedBlock; auto decompImagePointer = decompressed + decompressedBlockStart; for(int i = 0; i < 4; i++) { - switch(ddsFormatType) + switch(resourceType) { case ResourceFormatType::BC1: case ResourceFormatType::BC2: @@ -567,30 +497,8 @@ struct RDCThumbnailProvider : public IThumbnailProvider, IInitializeWithStream 1); // set blue channel to 0 } break; - case ResourceFormatType::BC6: // other formats - case ResourceFormatType::BC7: - case ResourceFormatType::A8: - case ResourceFormatType::ASTC: - case ResourceFormatType::D16S8: - case ResourceFormatType::D24S8: - case ResourceFormatType::D32S8: - case ResourceFormatType::EAC: - case ResourceFormatType::ETC2: - case ResourceFormatType::PVRTC: - case ResourceFormatType::R10G10B10A2: - case ResourceFormatType::R11G11B10: - case ResourceFormatType::R4G4: - case ResourceFormatType::R4G4B4A4: - case ResourceFormatType::R5G5B5A1: - case ResourceFormatType::R5G6B5: - case ResourceFormatType::R9G9B9E5: - case ResourceFormatType::Regular: - case ResourceFormatType::S8: - case ResourceFormatType::Undefined: - case ResourceFormatType::YUV10: - case ResourceFormatType::YUV12: - case ResourceFormatType::YUV16: - case ResourceFormatType::YUV8: return E_NOTIMPL; + default: + return E_NOTIMPL; // other formats } decompImagePointer += decompressedStride; } @@ -767,4 +675,4 @@ STDAPI DllCanUnloadNow() return S_FALSE; return S_OK; -} +} \ No newline at end of file