created new DDS loader that's better for streaming
This commit is contained in:
@@ -4,7 +4,7 @@
|
||||
#include "wiRandom.h"
|
||||
|
||||
#include "Utility/stb_image.h"
|
||||
#include "Utility/dds_write.h"
|
||||
#include "Utility/dds.h"
|
||||
|
||||
#define TINYGLTF_IMPLEMENTATION
|
||||
#define TINYGLTF_NO_FS
|
||||
@@ -1976,10 +1976,10 @@ void ImportModel_GLTF(const std::string& fileName, Scene& scene)
|
||||
}
|
||||
|
||||
wi::vector<uint8_t> dds;
|
||||
dds.resize(sizeof(dds_write::Header) + wholeDataSize);
|
||||
dds_write::write_header(
|
||||
dds.resize(sizeof(dds::Header) + wholeDataSize);
|
||||
dds::write_header(
|
||||
dds.data(),
|
||||
dds_write::DXGI_FORMAT_R9G9B9E5_SHAREDEXP,
|
||||
dds::DXGI_FORMAT_R9G9B9E5_SHAREDEXP,
|
||||
desc.width,
|
||||
desc.height,
|
||||
desc.mip_levels,
|
||||
@@ -1987,7 +1987,7 @@ void ImportModel_GLTF(const std::string& fileName, Scene& scene)
|
||||
true
|
||||
);
|
||||
|
||||
size_t offset = sizeof(dds_write::Header);
|
||||
size_t offset = sizeof(dds::Header);
|
||||
for (auto& x : hdr_datas)
|
||||
{
|
||||
std::memcpy(dds.data() + offset, x.data(), x.size() * sizeof(XMFLOAT3SE));
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,399 +0,0 @@
|
||||
#ifndef DDS_WRITE_H
|
||||
#define DDS_WRITE_H
|
||||
// Minimal DDS file writer utility created by Turánszki János for Wicked Engine: https://github.com/turanszkij/WickedEngine
|
||||
// Based on DDS specification: https://learn.microsoft.com/en-us/windows/win32/direct3ddds/dx-graphics-dds-pguide#dds-file-layout
|
||||
//
|
||||
// Usage:
|
||||
// 1) Allocate memory of: sizeof(dds_write::Header) + your whole texture size
|
||||
// 2) Use dds_write::write_header() to write DDS header into memory
|
||||
// 3) write your texture data into memory manually after allocation + sizeof(dds_write::Header)
|
||||
// 4) this only writes to memory, so write the result into file manually if you want to
|
||||
// 5) enjoy
|
||||
//
|
||||
// Example:
|
||||
// std::vector<uint8_t> texturedata; // your texture data in a GPU format
|
||||
// std::vector<uint8_t> filedata; // DDS file data container
|
||||
// filedata.resize(sizeof(dds_write::Header) + texturedata.size()); // allocate memory
|
||||
//
|
||||
// dds_write::write_header(
|
||||
// filedata.data(),
|
||||
// dds_write::DXGI_FORMAT_R8G8B8A8_UNORM,
|
||||
// width,
|
||||
// height,
|
||||
// mip_count, // optional
|
||||
// array_size, // optional
|
||||
// false, // optional (is_cubemap)
|
||||
// depth // optional
|
||||
// );
|
||||
// std::memcpy(filedata.data() + sizeof(dds_write::Header), texturedata.data(), texturedata.size());
|
||||
//
|
||||
// ...Or you can just freely use the structures here to write your own DDS header
|
||||
//
|
||||
// Note: texture data need to be in the following layout in the DDS file, tightly packed:
|
||||
// - Array slice 0 / cubemap face +X
|
||||
// - mipmap 0
|
||||
// - depth slice 0
|
||||
// - depth slice 1
|
||||
// - ...
|
||||
// - mipmap 1
|
||||
// - depth slice 0
|
||||
// - depth slice 1
|
||||
// - ...
|
||||
// - ...
|
||||
// - Array slice 1 / cubemap face -X
|
||||
// - mipmap 0
|
||||
// - depth slice 0
|
||||
// - depth slice 1
|
||||
// - ...
|
||||
// - mipmap 1
|
||||
// - depth slice 0
|
||||
// - depth slice 1
|
||||
// - ...
|
||||
// - ...
|
||||
// - ...
|
||||
// Note: This is similar to how you would provide the texture with DirectX 11 API's D3D11_SUBRESOURCE_DATA when creating textures
|
||||
//
|
||||
// Support:
|
||||
// - This will only create DX10 version of DDS, doesn't support legacy
|
||||
// - Tested with Texture 1D, Texture 2D, Texture 2D Array, Cubemap, Cubemap array, 3D Texture
|
||||
// - Tested with uncompressed formats and block compressed
|
||||
// - mipmaps: Yes
|
||||
// - arrays: Yes
|
||||
//
|
||||
// MIT License (see the end of this file)
|
||||
|
||||
namespace dds_write
|
||||
{
|
||||
using DWORD = unsigned;
|
||||
using UINT = unsigned;
|
||||
|
||||
enum DDS_PIXELFORMAT_FLAGS
|
||||
{
|
||||
DDPF_ALPHAPIXELS = 0x1, // Texture contains alpha data; dwRGBAlphaBitMask contains valid data.
|
||||
DDPF_ALPHA = 0x2, // Used in some older DDS files for alpha channel only uncompressed data (dwRGBBitCount contains the alpha channel bitcount; dwABitMask contains valid data)
|
||||
DDPF_FOURCC = 0x4, // Texture contains compressed RGB data; dwFourCC contains valid data.
|
||||
DDPF_RGB = 0x40, // Texture contains uncompressed RGB data; dwRGBBitCount and the RGB masks (dwRBitMask, dwGBitMask, dwBBitMask) contain valid data.
|
||||
DDPF_YUV = 0x200, // Used in some older DDS files for YUV uncompressed data (dwRGBBitCount contains the YUV bit count; dwRBitMask contains the Y mask, dwGBitMask contains the U mask, dwBBitMask contains the V mask)
|
||||
DDPF_LUMINANCE = 0x20000 // Used in some older DDS files for single channel color uncompressed data (dwRGBBitCount contains the luminance channel bit count; dwRBitMask contains the channel mask). Can be combined with DDPF_ALPHAPIXELS for a two channel DDS file.
|
||||
};
|
||||
struct DDS_PIXELFORMAT {
|
||||
DWORD dwSize;
|
||||
DWORD dwFlags;
|
||||
DWORD dwFourCC;
|
||||
DWORD dwRGBBitCount;
|
||||
DWORD dwRBitMask;
|
||||
DWORD dwGBitMask;
|
||||
DWORD dwBBitMask;
|
||||
DWORD dwABitMask;
|
||||
};
|
||||
enum DDSD_CAPS
|
||||
{
|
||||
DDSD_CAPS = 0x1, // Required in every .dds file.
|
||||
DDSD_HEIGHT = 0x2, // Required in every .dds file.
|
||||
DDSD_WIDTH = 0x4, // Required in every .dds file.
|
||||
DDSD_PITCH = 0x8, // Required when pitch is provided for an uncompressed texture.
|
||||
DDSD_PIXELFORMAT = 0x1000, // Required in every .dds file.
|
||||
DDSD_MIPMAPCOUNT = 0x20000, // Required in a mipmapped texture.
|
||||
DDSD_LINEARSIZE = 0x80000, // Required when pitch is provided for a compressed texture.
|
||||
DDSD_DEPTH = 0x800000 // Required in a depth texture.
|
||||
};
|
||||
enum DDSCAPS
|
||||
{
|
||||
DDSCAPS_COMPLEX = 0x8, // Optional; must be used on any file that contains more than one surface (a mipmap, a cubic environment map, or mipmapped volume texture).
|
||||
DDSCAPS_MIPMAP = 0x400000, // Optional; should be used for a mipmap.
|
||||
DDSCAPS_TEXTURE = 0x1000, // Required
|
||||
};
|
||||
enum DDSCAPS2
|
||||
{
|
||||
DDSCAPS2_CUBEMAP = 0x200, // Required for a cube map.
|
||||
DDSCAPS2_CUBEMAP_POSITIVEX = 0x400, // Required when these surfaces are stored in a cube map.
|
||||
DDSCAPS2_CUBEMAP_NEGATIVEX = 0x800, // Required when these surfaces are stored in a cube map.
|
||||
DDSCAPS2_CUBEMAP_POSITIVEY = 0x1000,// Required when these surfaces are stored in a cube map.
|
||||
DDSCAPS2_CUBEMAP_NEGATIVEY = 0x2000,// Required when these surfaces are stored in a cube map.
|
||||
DDSCAPS2_CUBEMAP_POSITIVEZ = 0x4000,// Required when these surfaces are stored in a cube map.
|
||||
DDSCAPS2_CUBEMAP_NEGATIVEZ = 0x8000,// Required when these surfaces are stored in a cube map.
|
||||
DDSCAPS2_VOLUME = 0x200000, // Required for a volume texture.
|
||||
};
|
||||
typedef struct {
|
||||
DWORD dwSize;
|
||||
DWORD dwFlags;
|
||||
DWORD dwHeight;
|
||||
DWORD dwWidth;
|
||||
DWORD dwPitchOrLinearSize;
|
||||
DWORD dwDepth;
|
||||
DWORD dwMipMapCount;
|
||||
DWORD dwReserved1[11];
|
||||
DDS_PIXELFORMAT ddspf;
|
||||
DWORD dwCaps;
|
||||
DWORD dwCaps2;
|
||||
DWORD dwCaps3;
|
||||
DWORD dwCaps4;
|
||||
DWORD dwReserved2;
|
||||
} DDS_HEADER;
|
||||
enum DXGI_FORMAT {
|
||||
DXGI_FORMAT_UNKNOWN = 0,
|
||||
DXGI_FORMAT_R32G32B32A32_TYPELESS = 1,
|
||||
DXGI_FORMAT_R32G32B32A32_FLOAT = 2,
|
||||
DXGI_FORMAT_R32G32B32A32_UINT = 3,
|
||||
DXGI_FORMAT_R32G32B32A32_SINT = 4,
|
||||
DXGI_FORMAT_R32G32B32_TYPELESS = 5,
|
||||
DXGI_FORMAT_R32G32B32_FLOAT = 6,
|
||||
DXGI_FORMAT_R32G32B32_UINT = 7,
|
||||
DXGI_FORMAT_R32G32B32_SINT = 8,
|
||||
DXGI_FORMAT_R16G16B16A16_TYPELESS = 9,
|
||||
DXGI_FORMAT_R16G16B16A16_FLOAT = 10,
|
||||
DXGI_FORMAT_R16G16B16A16_UNORM = 11,
|
||||
DXGI_FORMAT_R16G16B16A16_UINT = 12,
|
||||
DXGI_FORMAT_R16G16B16A16_SNORM = 13,
|
||||
DXGI_FORMAT_R16G16B16A16_SINT = 14,
|
||||
DXGI_FORMAT_R32G32_TYPELESS = 15,
|
||||
DXGI_FORMAT_R32G32_FLOAT = 16,
|
||||
DXGI_FORMAT_R32G32_UINT = 17,
|
||||
DXGI_FORMAT_R32G32_SINT = 18,
|
||||
DXGI_FORMAT_R32G8X24_TYPELESS = 19,
|
||||
DXGI_FORMAT_D32_FLOAT_S8X24_UINT = 20,
|
||||
DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS = 21,
|
||||
DXGI_FORMAT_X32_TYPELESS_G8X24_UINT = 22,
|
||||
DXGI_FORMAT_R10G10B10A2_TYPELESS = 23,
|
||||
DXGI_FORMAT_R10G10B10A2_UNORM = 24,
|
||||
DXGI_FORMAT_R10G10B10A2_UINT = 25,
|
||||
DXGI_FORMAT_R11G11B10_FLOAT = 26,
|
||||
DXGI_FORMAT_R8G8B8A8_TYPELESS = 27,
|
||||
DXGI_FORMAT_R8G8B8A8_UNORM = 28,
|
||||
DXGI_FORMAT_R8G8B8A8_UNORM_SRGB = 29,
|
||||
DXGI_FORMAT_R8G8B8A8_UINT = 30,
|
||||
DXGI_FORMAT_R8G8B8A8_SNORM = 31,
|
||||
DXGI_FORMAT_R8G8B8A8_SINT = 32,
|
||||
DXGI_FORMAT_R16G16_TYPELESS = 33,
|
||||
DXGI_FORMAT_R16G16_FLOAT = 34,
|
||||
DXGI_FORMAT_R16G16_UNORM = 35,
|
||||
DXGI_FORMAT_R16G16_UINT = 36,
|
||||
DXGI_FORMAT_R16G16_SNORM = 37,
|
||||
DXGI_FORMAT_R16G16_SINT = 38,
|
||||
DXGI_FORMAT_R32_TYPELESS = 39,
|
||||
DXGI_FORMAT_D32_FLOAT = 40,
|
||||
DXGI_FORMAT_R32_FLOAT = 41,
|
||||
DXGI_FORMAT_R32_UINT = 42,
|
||||
DXGI_FORMAT_R32_SINT = 43,
|
||||
DXGI_FORMAT_R24G8_TYPELESS = 44,
|
||||
DXGI_FORMAT_D24_UNORM_S8_UINT = 45,
|
||||
DXGI_FORMAT_R24_UNORM_X8_TYPELESS = 46,
|
||||
DXGI_FORMAT_X24_TYPELESS_G8_UINT = 47,
|
||||
DXGI_FORMAT_R8G8_TYPELESS = 48,
|
||||
DXGI_FORMAT_R8G8_UNORM = 49,
|
||||
DXGI_FORMAT_R8G8_UINT = 50,
|
||||
DXGI_FORMAT_R8G8_SNORM = 51,
|
||||
DXGI_FORMAT_R8G8_SINT = 52,
|
||||
DXGI_FORMAT_R16_TYPELESS = 53,
|
||||
DXGI_FORMAT_R16_FLOAT = 54,
|
||||
DXGI_FORMAT_D16_UNORM = 55,
|
||||
DXGI_FORMAT_R16_UNORM = 56,
|
||||
DXGI_FORMAT_R16_UINT = 57,
|
||||
DXGI_FORMAT_R16_SNORM = 58,
|
||||
DXGI_FORMAT_R16_SINT = 59,
|
||||
DXGI_FORMAT_R8_TYPELESS = 60,
|
||||
DXGI_FORMAT_R8_UNORM = 61,
|
||||
DXGI_FORMAT_R8_UINT = 62,
|
||||
DXGI_FORMAT_R8_SNORM = 63,
|
||||
DXGI_FORMAT_R8_SINT = 64,
|
||||
DXGI_FORMAT_A8_UNORM = 65,
|
||||
DXGI_FORMAT_R1_UNORM = 66,
|
||||
DXGI_FORMAT_R9G9B9E5_SHAREDEXP = 67,
|
||||
DXGI_FORMAT_R8G8_B8G8_UNORM = 68,
|
||||
DXGI_FORMAT_G8R8_G8B8_UNORM = 69,
|
||||
DXGI_FORMAT_BC1_TYPELESS = 70,
|
||||
DXGI_FORMAT_BC1_UNORM = 71,
|
||||
DXGI_FORMAT_BC1_UNORM_SRGB = 72,
|
||||
DXGI_FORMAT_BC2_TYPELESS = 73,
|
||||
DXGI_FORMAT_BC2_UNORM = 74,
|
||||
DXGI_FORMAT_BC2_UNORM_SRGB = 75,
|
||||
DXGI_FORMAT_BC3_TYPELESS = 76,
|
||||
DXGI_FORMAT_BC3_UNORM = 77,
|
||||
DXGI_FORMAT_BC3_UNORM_SRGB = 78,
|
||||
DXGI_FORMAT_BC4_TYPELESS = 79,
|
||||
DXGI_FORMAT_BC4_UNORM = 80,
|
||||
DXGI_FORMAT_BC4_SNORM = 81,
|
||||
DXGI_FORMAT_BC5_TYPELESS = 82,
|
||||
DXGI_FORMAT_BC5_UNORM = 83,
|
||||
DXGI_FORMAT_BC5_SNORM = 84,
|
||||
DXGI_FORMAT_B5G6R5_UNORM = 85,
|
||||
DXGI_FORMAT_B5G5R5A1_UNORM = 86,
|
||||
DXGI_FORMAT_B8G8R8A8_UNORM = 87,
|
||||
DXGI_FORMAT_B8G8R8X8_UNORM = 88,
|
||||
DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM = 89,
|
||||
DXGI_FORMAT_B8G8R8A8_TYPELESS = 90,
|
||||
DXGI_FORMAT_B8G8R8A8_UNORM_SRGB = 91,
|
||||
DXGI_FORMAT_B8G8R8X8_TYPELESS = 92,
|
||||
DXGI_FORMAT_B8G8R8X8_UNORM_SRGB = 93,
|
||||
DXGI_FORMAT_BC6H_TYPELESS = 94,
|
||||
DXGI_FORMAT_BC6H_UF16 = 95,
|
||||
DXGI_FORMAT_BC6H_SF16 = 96,
|
||||
DXGI_FORMAT_BC7_TYPELESS = 97,
|
||||
DXGI_FORMAT_BC7_UNORM = 98,
|
||||
DXGI_FORMAT_BC7_UNORM_SRGB = 99,
|
||||
DXGI_FORMAT_AYUV = 100,
|
||||
DXGI_FORMAT_Y410 = 101,
|
||||
DXGI_FORMAT_Y416 = 102,
|
||||
DXGI_FORMAT_NV12 = 103,
|
||||
DXGI_FORMAT_P010 = 104,
|
||||
DXGI_FORMAT_P016 = 105,
|
||||
DXGI_FORMAT_420_OPAQUE = 106,
|
||||
DXGI_FORMAT_YUY2 = 107,
|
||||
DXGI_FORMAT_Y210 = 108,
|
||||
DXGI_FORMAT_Y216 = 109,
|
||||
DXGI_FORMAT_NV11 = 110,
|
||||
DXGI_FORMAT_AI44 = 111,
|
||||
DXGI_FORMAT_IA44 = 112,
|
||||
DXGI_FORMAT_P8 = 113,
|
||||
DXGI_FORMAT_A8P8 = 114,
|
||||
DXGI_FORMAT_B4G4R4A4_UNORM = 115,
|
||||
DXGI_FORMAT_P208 = 130,
|
||||
DXGI_FORMAT_V208 = 131,
|
||||
DXGI_FORMAT_V408 = 132,
|
||||
DXGI_FORMAT_SAMPLER_FEEDBACK_MIN_MIP_OPAQUE,
|
||||
DXGI_FORMAT_SAMPLER_FEEDBACK_MIP_REGION_USED_OPAQUE,
|
||||
DXGI_FORMAT_FORCE_UINT = 0xffffffff
|
||||
};
|
||||
enum D3D10_RESOURCE_DIMENSION {
|
||||
D3D10_RESOURCE_DIMENSION_UNKNOWN = 0,
|
||||
D3D10_RESOURCE_DIMENSION_BUFFER = 1,
|
||||
D3D10_RESOURCE_DIMENSION_TEXTURE1D = 2,
|
||||
D3D10_RESOURCE_DIMENSION_TEXTURE2D = 3,
|
||||
D3D10_RESOURCE_DIMENSION_TEXTURE3D = 4
|
||||
};
|
||||
enum DDS_RESOURCE_MISC_TEXTURECUBE
|
||||
{
|
||||
DDS_RESOURCE_MISC_TEXTURECUBE = 0x4, // Indicates a 2D texture is a cube-map texture.
|
||||
};
|
||||
enum DDS_ALPHA_MODE
|
||||
{
|
||||
DDS_ALPHA_MODE_UNKNOWN = 0x0, // Alpha channel content is unknown. This is the value for legacy files, which typically is assumed to be 'straight' alpha.
|
||||
DDS_ALPHA_MODE_STRAIGHT = 0x1, // Any alpha channel content is presumed to use straight alpha.
|
||||
DDS_ALPHA_MODE_PREMULTIPLIED = 0x2, // Any alpha channel content is using premultiplied alpha. The only legacy file formats that indicate this information are 'DX2' and 'DX4'.
|
||||
DDS_ALPHA_MODE_OPAQUE = 0x3, // Any alpha channel content is all set to fully opaque.
|
||||
DDS_ALPHA_MODE_CUSTOM = 0x4, // Any alpha channel content is being used as a 4th channel and is not intended to represent transparency (straight or premultiplied).
|
||||
};
|
||||
typedef struct {
|
||||
DXGI_FORMAT dxgiFormat;
|
||||
D3D10_RESOURCE_DIMENSION resourceDimension;
|
||||
UINT miscFlag;
|
||||
UINT arraySize;
|
||||
UINT miscFlags2;
|
||||
} DDS_HEADER_DXT10;
|
||||
|
||||
static constexpr DWORD fourcc(char a, char b, char c, char d)
|
||||
{
|
||||
return (((unsigned)(d) << 24) | ((unsigned)(c) << 16) | ((unsigned)(b) << 8) | (unsigned)(a));
|
||||
}
|
||||
|
||||
struct Header
|
||||
{
|
||||
DWORD magic;
|
||||
DDS_HEADER header;
|
||||
DDS_HEADER_DXT10 header10;
|
||||
};
|
||||
|
||||
// Write the DDS header into memory.
|
||||
// dst: destination file in memory, must be at least of sizeof(dds_write::Header)
|
||||
// format: data format of texture data that will be placed after header
|
||||
// width: width of top mip level
|
||||
// height: height of top mip level (you can set this to 0 to indicate 1D texture)
|
||||
// mip_levels: number of mip levels in the file
|
||||
// array_size: number of slices in the file. For cubemaps, there is one slice for every face. For 3D texture, there is always only 1 slice.
|
||||
// is_cubemap: whether the texture is a cubemap. If it is a cubemap, it must have at least array_size = 6
|
||||
// depth: depth of 3D texture (you can set this to 0 to indicate that the texture is not 3D)
|
||||
inline void write_header(
|
||||
void* dst,
|
||||
DXGI_FORMAT format,
|
||||
unsigned int width,
|
||||
unsigned int height,
|
||||
unsigned int mip_levels = 1,
|
||||
unsigned int array_size = 1,
|
||||
bool is_cubemap = false,
|
||||
unsigned int depth = 0
|
||||
)
|
||||
{
|
||||
Header h = {};
|
||||
h.magic = fourcc('D', 'D', 'S', ' ');
|
||||
h.header.dwSize = sizeof(DDS_HEADER);
|
||||
h.header.dwFlags =
|
||||
DDSD_CAPS |
|
||||
DDSD_WIDTH |
|
||||
DDSD_HEIGHT |
|
||||
DDSD_PIXELFORMAT |
|
||||
DDSD_MIPMAPCOUNT
|
||||
;
|
||||
h.header.dwWidth = width;
|
||||
h.header.dwHeight = height;
|
||||
h.header.dwDepth = depth;
|
||||
h.header.dwMipMapCount = mip_levels;
|
||||
h.header.ddspf.dwSize = sizeof(DDS_PIXELFORMAT);
|
||||
h.header.ddspf.dwFlags = DDPF_FOURCC;
|
||||
h.header.ddspf.dwFourCC = fourcc('D', 'X', '1', '0');
|
||||
h.header.dwCaps = DDSCAPS_TEXTURE;
|
||||
|
||||
h.header10.dxgiFormat = format;
|
||||
h.header10.resourceDimension = D3D10_RESOURCE_DIMENSION_TEXTURE2D;
|
||||
h.header10.miscFlags2 = DDS_ALPHA_MODE_UNKNOWN;
|
||||
|
||||
if (is_cubemap)
|
||||
{
|
||||
h.header10.arraySize = array_size / 6;
|
||||
h.header.dwCaps |= DDSCAPS_COMPLEX;
|
||||
h.header.dwCaps2 =
|
||||
DDSCAPS2_CUBEMAP |
|
||||
DDSCAPS2_CUBEMAP_POSITIVEX |
|
||||
DDSCAPS2_CUBEMAP_NEGATIVEX |
|
||||
DDSCAPS2_CUBEMAP_POSITIVEY |
|
||||
DDSCAPS2_CUBEMAP_NEGATIVEY |
|
||||
DDSCAPS2_CUBEMAP_POSITIVEZ |
|
||||
DDSCAPS2_CUBEMAP_NEGATIVEZ
|
||||
;
|
||||
h.header10.miscFlag = DDS_RESOURCE_MISC_TEXTURECUBE;
|
||||
}
|
||||
else if (depth > 0)
|
||||
{
|
||||
h.header10.arraySize = 1;
|
||||
h.header10.resourceDimension = D3D10_RESOURCE_DIMENSION_TEXTURE3D;
|
||||
h.header.dwCaps2 = DDSCAPS2_VOLUME;
|
||||
}
|
||||
else
|
||||
{
|
||||
h.header10.arraySize = array_size;
|
||||
}
|
||||
|
||||
if (height == 0)
|
||||
{
|
||||
h.header10.resourceDimension = D3D10_RESOURCE_DIMENSION_TEXTURE1D;
|
||||
h.header.dwHeight = 1;
|
||||
}
|
||||
if (mip_levels > 1)
|
||||
{
|
||||
h.header.dwCaps |= DDSCAPS_COMPLEX;
|
||||
}
|
||||
|
||||
*(Header*)dst = h;
|
||||
}
|
||||
}
|
||||
|
||||
#endif // DDS_WRITE_H
|
||||
|
||||
//Copyright(c) 2023 Turánszki János
|
||||
//
|
||||
//Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
//of this software and associated documentation files(the "Software"), to deal
|
||||
//in the Software without restriction, including without limitation the rights
|
||||
//to use, copy, modify, merge, publish, distribute, sublicense, and /or sell
|
||||
//copies of the Software, and to permit persons to whom the Software is
|
||||
//furnished to do so, subject to the following conditions :
|
||||
//
|
||||
//The above copyright notice and this permission notice shall be included in
|
||||
//all copies or substantial portions of the Software.
|
||||
//
|
||||
//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
//IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
//FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
|
||||
//AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
//LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
//OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
//THE SOFTWARE.
|
||||
File diff suppressed because it is too large
Load Diff
@@ -15,9 +15,6 @@
|
||||
#define STB_TRUETYPE_IMPLEMENTATION
|
||||
#include "stb_truetype.h"
|
||||
|
||||
#define TINYDDSLOADER_IMPLEMENTATION
|
||||
#include "tinyddsloader.h"
|
||||
|
||||
#define QOI_IMPLEMENTATION
|
||||
#include "qoi.h"
|
||||
|
||||
|
||||
@@ -229,7 +229,7 @@
|
||||
<ClInclude Include="$(MSBuildThisFileDirectory)BULLET\LinearMath\btTransformUtil.h" />
|
||||
<ClInclude Include="$(MSBuildThisFileDirectory)BULLET\LinearMath\btVector3.h" />
|
||||
<ClInclude Include="$(MSBuildThisFileDirectory)CommonInclude.h" />
|
||||
<ClInclude Include="$(MSBuildThisFileDirectory)Utility\dds_write.h" />
|
||||
<ClInclude Include="$(MSBuildThisFileDirectory)Utility\dds.h" />
|
||||
<ClInclude Include="$(MSBuildThisFileDirectory)Utility\dxva.h" />
|
||||
<ClInclude Include="$(MSBuildThisFileDirectory)Utility\h264.h" />
|
||||
<ClInclude Include="$(MSBuildThisFileDirectory)Utility\lodepng.h" />
|
||||
@@ -264,7 +264,6 @@
|
||||
<ClInclude Include="$(MSBuildThisFileDirectory)Utility\stb_image.h" />
|
||||
<ClInclude Include="$(MSBuildThisFileDirectory)Utility\stb_image_write.h" />
|
||||
<ClInclude Include="$(MSBuildThisFileDirectory)Utility\stb_truetype.h" />
|
||||
<ClInclude Include="$(MSBuildThisFileDirectory)Utility\tinyddsloader.h" />
|
||||
<ClInclude Include="$(MSBuildThisFileDirectory)Utility\vk_mem_alloc.h" />
|
||||
<ClInclude Include="$(MSBuildThisFileDirectory)Utility\volk.h" />
|
||||
<ClInclude Include="$(MSBuildThisFileDirectory)wiArchive.h" />
|
||||
|
||||
@@ -972,9 +972,6 @@
|
||||
<ClInclude Include="$(MSBuildThisFileDirectory)wiNetwork.h">
|
||||
<Filter>ENGINE\Network</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="$(MSBuildThisFileDirectory)Utility\tinyddsloader.h">
|
||||
<Filter>UTILITY</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="$(MSBuildThisFileDirectory)Utility\vk_mem_alloc.h">
|
||||
<Filter>UTILITY</Filter>
|
||||
</ClInclude>
|
||||
@@ -1119,7 +1116,7 @@
|
||||
<ClInclude Include="$(MSBuildThisFileDirectory)Utility\dxva.h">
|
||||
<Filter>UTILITY</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="$(MSBuildThisFileDirectory)Utility\dds_write.h">
|
||||
<ClInclude Include="$(MSBuildThisFileDirectory)Utility\dds.h">
|
||||
<Filter>UTILITY</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="$(MSBuildThisFileDirectory)Utility\lodepng.h">
|
||||
|
||||
+65
-65
@@ -5,7 +5,7 @@
|
||||
#include "wiMath.h"
|
||||
|
||||
#include "Utility/lodepng.h"
|
||||
#include "Utility/dds_write.h"
|
||||
#include "Utility/dds.h"
|
||||
#include "Utility/stb_image_write.h"
|
||||
#include "Utility/basis_universal/encoder/basisu_comp.h"
|
||||
#include "Utility/basis_universal/encoder/basisu_gpu_texture.h"
|
||||
@@ -229,197 +229,197 @@ namespace wi::helper
|
||||
|
||||
if (extension.compare("DDS") == 0)
|
||||
{
|
||||
filedata.resize(sizeof(dds_write::Header) + texturedata.size());
|
||||
dds_write::DXGI_FORMAT dds_format = dds_write::DXGI_FORMAT_UNKNOWN;
|
||||
filedata.resize(sizeof(dds::Header) + texturedata.size());
|
||||
dds::DXGI_FORMAT dds_format = dds::DXGI_FORMAT_UNKNOWN;
|
||||
switch (desc.format)
|
||||
{
|
||||
case wi::graphics::Format::R32G32B32A32_FLOAT:
|
||||
dds_format = dds_write::DXGI_FORMAT_R32G32B32A32_FLOAT;
|
||||
dds_format = dds::DXGI_FORMAT_R32G32B32A32_FLOAT;
|
||||
break;
|
||||
case wi::graphics::Format::R32G32B32A32_UINT:
|
||||
dds_format = dds_write::DXGI_FORMAT_R32G32B32A32_UINT;
|
||||
dds_format = dds::DXGI_FORMAT_R32G32B32A32_UINT;
|
||||
break;
|
||||
case wi::graphics::Format::R32G32B32A32_SINT:
|
||||
dds_format = dds_write::DXGI_FORMAT_R32G32B32A32_SINT;
|
||||
dds_format = dds::DXGI_FORMAT_R32G32B32A32_SINT;
|
||||
break;
|
||||
case wi::graphics::Format::R32G32B32_FLOAT:
|
||||
dds_format = dds_write::DXGI_FORMAT_R32G32B32_FLOAT;
|
||||
dds_format = dds::DXGI_FORMAT_R32G32B32_FLOAT;
|
||||
break;
|
||||
case wi::graphics::Format::R32G32B32_UINT:
|
||||
dds_format = dds_write::DXGI_FORMAT_R32G32B32_UINT;
|
||||
dds_format = dds::DXGI_FORMAT_R32G32B32_UINT;
|
||||
break;
|
||||
case wi::graphics::Format::R32G32B32_SINT:
|
||||
dds_format = dds_write::DXGI_FORMAT_R32G32B32_SINT;
|
||||
dds_format = dds::DXGI_FORMAT_R32G32B32_SINT;
|
||||
break;
|
||||
case wi::graphics::Format::R16G16B16A16_FLOAT:
|
||||
dds_format = dds_write::DXGI_FORMAT_R16G16B16A16_FLOAT;
|
||||
dds_format = dds::DXGI_FORMAT_R16G16B16A16_FLOAT;
|
||||
break;
|
||||
case wi::graphics::Format::R16G16B16A16_UNORM:
|
||||
dds_format = dds_write::DXGI_FORMAT_R16G16B16A16_UNORM;
|
||||
dds_format = dds::DXGI_FORMAT_R16G16B16A16_UNORM;
|
||||
break;
|
||||
case wi::graphics::Format::R16G16B16A16_UINT:
|
||||
dds_format = dds_write::DXGI_FORMAT_R16G16B16A16_UINT;
|
||||
dds_format = dds::DXGI_FORMAT_R16G16B16A16_UINT;
|
||||
break;
|
||||
case wi::graphics::Format::R16G16B16A16_SNORM:
|
||||
dds_format = dds_write::DXGI_FORMAT_R16G16B16A16_SNORM;
|
||||
dds_format = dds::DXGI_FORMAT_R16G16B16A16_SNORM;
|
||||
break;
|
||||
case wi::graphics::Format::R16G16B16A16_SINT:
|
||||
dds_format = dds_write::DXGI_FORMAT_R16G16B16A16_SINT;
|
||||
dds_format = dds::DXGI_FORMAT_R16G16B16A16_SINT;
|
||||
break;
|
||||
case wi::graphics::Format::R32G32_FLOAT:
|
||||
dds_format = dds_write::DXGI_FORMAT_R32G32_FLOAT;
|
||||
dds_format = dds::DXGI_FORMAT_R32G32_FLOAT;
|
||||
break;
|
||||
case wi::graphics::Format::R32G32_UINT:
|
||||
dds_format = dds_write::DXGI_FORMAT_R32G32_UINT;
|
||||
dds_format = dds::DXGI_FORMAT_R32G32_UINT;
|
||||
break;
|
||||
case wi::graphics::Format::R32G32_SINT:
|
||||
dds_format = dds_write::DXGI_FORMAT_R32G32_SINT;
|
||||
dds_format = dds::DXGI_FORMAT_R32G32_SINT;
|
||||
break;
|
||||
case wi::graphics::Format::R10G10B10A2_UNORM:
|
||||
dds_format = dds_write::DXGI_FORMAT_R10G10B10A2_UNORM;
|
||||
dds_format = dds::DXGI_FORMAT_R10G10B10A2_UNORM;
|
||||
break;
|
||||
case wi::graphics::Format::R10G10B10A2_UINT:
|
||||
dds_format = dds_write::DXGI_FORMAT_R10G10B10A2_UINT;
|
||||
dds_format = dds::DXGI_FORMAT_R10G10B10A2_UINT;
|
||||
break;
|
||||
case wi::graphics::Format::R11G11B10_FLOAT:
|
||||
dds_format = dds_write::DXGI_FORMAT_R11G11B10_FLOAT;
|
||||
dds_format = dds::DXGI_FORMAT_R11G11B10_FLOAT;
|
||||
break;
|
||||
case wi::graphics::Format::R8G8B8A8_UNORM:
|
||||
dds_format = dds_write::DXGI_FORMAT_R8G8B8A8_UNORM;
|
||||
dds_format = dds::DXGI_FORMAT_R8G8B8A8_UNORM;
|
||||
break;
|
||||
case wi::graphics::Format::R8G8B8A8_UNORM_SRGB:
|
||||
dds_format = dds_write::DXGI_FORMAT_R8G8B8A8_UNORM_SRGB;
|
||||
dds_format = dds::DXGI_FORMAT_R8G8B8A8_UNORM_SRGB;
|
||||
break;
|
||||
case wi::graphics::Format::R8G8B8A8_UINT:
|
||||
dds_format = dds_write::DXGI_FORMAT_R8G8B8A8_UINT;
|
||||
dds_format = dds::DXGI_FORMAT_R8G8B8A8_UINT;
|
||||
break;
|
||||
case wi::graphics::Format::R8G8B8A8_SNORM:
|
||||
dds_format = dds_write::DXGI_FORMAT_R8G8B8A8_SNORM;
|
||||
dds_format = dds::DXGI_FORMAT_R8G8B8A8_SNORM;
|
||||
break;
|
||||
case wi::graphics::Format::R8G8B8A8_SINT:
|
||||
dds_format = dds_write::DXGI_FORMAT_R8G8B8A8_SINT;
|
||||
dds_format = dds::DXGI_FORMAT_R8G8B8A8_SINT;
|
||||
break;
|
||||
case wi::graphics::Format::B8G8R8A8_UNORM:
|
||||
dds_format = dds_write::DXGI_FORMAT_B8G8R8A8_UNORM;
|
||||
dds_format = dds::DXGI_FORMAT_B8G8R8A8_UNORM;
|
||||
break;
|
||||
case wi::graphics::Format::B8G8R8A8_UNORM_SRGB:
|
||||
dds_format = dds_write::DXGI_FORMAT_R16G16_SINT;
|
||||
dds_format = dds::DXGI_FORMAT_R16G16_SINT;
|
||||
break;
|
||||
case wi::graphics::Format::R16G16_FLOAT:
|
||||
dds_format = dds_write::DXGI_FORMAT_R16G16_FLOAT;
|
||||
dds_format = dds::DXGI_FORMAT_R16G16_FLOAT;
|
||||
break;
|
||||
case wi::graphics::Format::R16G16_UNORM:
|
||||
dds_format = dds_write::DXGI_FORMAT_R16G16_UNORM;
|
||||
dds_format = dds::DXGI_FORMAT_R16G16_UNORM;
|
||||
break;
|
||||
case wi::graphics::Format::R16G16_UINT:
|
||||
dds_format = dds_write::DXGI_FORMAT_R16G16_UINT;
|
||||
dds_format = dds::DXGI_FORMAT_R16G16_UINT;
|
||||
break;
|
||||
case wi::graphics::Format::R16G16_SNORM:
|
||||
dds_format = dds_write::DXGI_FORMAT_R16G16_SNORM;
|
||||
dds_format = dds::DXGI_FORMAT_R16G16_SNORM;
|
||||
break;
|
||||
case wi::graphics::Format::R16G16_SINT:
|
||||
dds_format = dds_write::DXGI_FORMAT_R16G16_SINT;
|
||||
dds_format = dds::DXGI_FORMAT_R16G16_SINT;
|
||||
break;
|
||||
case wi::graphics::Format::D32_FLOAT:
|
||||
case wi::graphics::Format::R32_FLOAT:
|
||||
dds_format = dds_write::DXGI_FORMAT_R32_FLOAT;
|
||||
dds_format = dds::DXGI_FORMAT_R32_FLOAT;
|
||||
break;
|
||||
case wi::graphics::Format::R32_UINT:
|
||||
dds_format = dds_write::DXGI_FORMAT_R32_UINT;
|
||||
dds_format = dds::DXGI_FORMAT_R32_UINT;
|
||||
break;
|
||||
case wi::graphics::Format::R32_SINT:
|
||||
dds_format = dds_write::DXGI_FORMAT_R32_SINT;
|
||||
dds_format = dds::DXGI_FORMAT_R32_SINT;
|
||||
break;
|
||||
case wi::graphics::Format::R9G9B9E5_SHAREDEXP:
|
||||
dds_format = dds_write::DXGI_FORMAT_R9G9B9E5_SHAREDEXP;
|
||||
dds_format = dds::DXGI_FORMAT_R9G9B9E5_SHAREDEXP;
|
||||
break;
|
||||
case wi::graphics::Format::R8G8_UNORM:
|
||||
dds_format = dds_write::DXGI_FORMAT_R8G8_UNORM;
|
||||
dds_format = dds::DXGI_FORMAT_R8G8_UNORM;
|
||||
break;
|
||||
case wi::graphics::Format::R8G8_UINT:
|
||||
dds_format = dds_write::DXGI_FORMAT_R8G8_UINT;
|
||||
dds_format = dds::DXGI_FORMAT_R8G8_UINT;
|
||||
break;
|
||||
case wi::graphics::Format::R8G8_SNORM:
|
||||
dds_format = dds_write::DXGI_FORMAT_R8G8_SNORM;
|
||||
dds_format = dds::DXGI_FORMAT_R8G8_SNORM;
|
||||
break;
|
||||
case wi::graphics::Format::R8G8_SINT:
|
||||
dds_format = dds_write::DXGI_FORMAT_R8G8_SINT;
|
||||
dds_format = dds::DXGI_FORMAT_R8G8_SINT;
|
||||
break;
|
||||
case wi::graphics::Format::R16_FLOAT:
|
||||
dds_format = dds_write::DXGI_FORMAT_R16_FLOAT;
|
||||
dds_format = dds::DXGI_FORMAT_R16_FLOAT;
|
||||
break;
|
||||
case wi::graphics::Format::D16_UNORM:
|
||||
case wi::graphics::Format::R16_UNORM:
|
||||
dds_format = dds_write::DXGI_FORMAT_R16_UNORM;
|
||||
dds_format = dds::DXGI_FORMAT_R16_UNORM;
|
||||
break;
|
||||
case wi::graphics::Format::R16_UINT:
|
||||
dds_format = dds_write::DXGI_FORMAT_R16_UINT;
|
||||
dds_format = dds::DXGI_FORMAT_R16_UINT;
|
||||
break;
|
||||
case wi::graphics::Format::R16_SNORM:
|
||||
dds_format = dds_write::DXGI_FORMAT_R16_SNORM;
|
||||
dds_format = dds::DXGI_FORMAT_R16_SNORM;
|
||||
break;
|
||||
case wi::graphics::Format::R16_SINT:
|
||||
dds_format = dds_write::DXGI_FORMAT_R16_SINT;
|
||||
dds_format = dds::DXGI_FORMAT_R16_SINT;
|
||||
break;
|
||||
case wi::graphics::Format::R8_UNORM:
|
||||
dds_format = dds_write::DXGI_FORMAT_R8_UNORM;
|
||||
dds_format = dds::DXGI_FORMAT_R8_UNORM;
|
||||
break;
|
||||
case wi::graphics::Format::R8_UINT:
|
||||
dds_format = dds_write::DXGI_FORMAT_R8_UINT;
|
||||
dds_format = dds::DXGI_FORMAT_R8_UINT;
|
||||
break;
|
||||
case wi::graphics::Format::R8_SNORM:
|
||||
dds_format = dds_write::DXGI_FORMAT_R8_SNORM;
|
||||
dds_format = dds::DXGI_FORMAT_R8_SNORM;
|
||||
break;
|
||||
case wi::graphics::Format::R8_SINT:
|
||||
dds_format = dds_write::DXGI_FORMAT_R8_SINT;
|
||||
dds_format = dds::DXGI_FORMAT_R8_SINT;
|
||||
break;
|
||||
case wi::graphics::Format::BC1_UNORM:
|
||||
dds_format = dds_write::DXGI_FORMAT_BC1_UNORM;
|
||||
dds_format = dds::DXGI_FORMAT_BC1_UNORM;
|
||||
break;
|
||||
case wi::graphics::Format::BC1_UNORM_SRGB:
|
||||
dds_format = dds_write::DXGI_FORMAT_BC1_UNORM_SRGB;
|
||||
dds_format = dds::DXGI_FORMAT_BC1_UNORM_SRGB;
|
||||
break;
|
||||
case wi::graphics::Format::BC2_UNORM:
|
||||
dds_format = dds_write::DXGI_FORMAT_BC2_UNORM;
|
||||
dds_format = dds::DXGI_FORMAT_BC2_UNORM;
|
||||
break;
|
||||
case wi::graphics::Format::BC2_UNORM_SRGB:
|
||||
dds_format = dds_write::DXGI_FORMAT_BC2_UNORM_SRGB;
|
||||
dds_format = dds::DXGI_FORMAT_BC2_UNORM_SRGB;
|
||||
break;
|
||||
case wi::graphics::Format::BC3_UNORM:
|
||||
dds_format = dds_write::DXGI_FORMAT_BC3_UNORM;
|
||||
dds_format = dds::DXGI_FORMAT_BC3_UNORM;
|
||||
break;
|
||||
case wi::graphics::Format::BC3_UNORM_SRGB:
|
||||
dds_format = dds_write::DXGI_FORMAT_BC3_UNORM_SRGB;
|
||||
dds_format = dds::DXGI_FORMAT_BC3_UNORM_SRGB;
|
||||
break;
|
||||
case wi::graphics::Format::BC4_UNORM:
|
||||
dds_format = dds_write::DXGI_FORMAT_BC4_UNORM;
|
||||
dds_format = dds::DXGI_FORMAT_BC4_UNORM;
|
||||
break;
|
||||
case wi::graphics::Format::BC4_SNORM:
|
||||
dds_format = dds_write::DXGI_FORMAT_BC4_SNORM;
|
||||
dds_format = dds::DXGI_FORMAT_BC4_SNORM;
|
||||
break;
|
||||
case wi::graphics::Format::BC5_UNORM:
|
||||
dds_format = dds_write::DXGI_FORMAT_BC5_UNORM;
|
||||
dds_format = dds::DXGI_FORMAT_BC5_UNORM;
|
||||
break;
|
||||
case wi::graphics::Format::BC5_SNORM:
|
||||
dds_format = dds_write::DXGI_FORMAT_BC5_SNORM;
|
||||
dds_format = dds::DXGI_FORMAT_BC5_SNORM;
|
||||
break;
|
||||
case wi::graphics::Format::BC6H_UF16:
|
||||
dds_format = dds_write::DXGI_FORMAT_BC6H_UF16;
|
||||
dds_format = dds::DXGI_FORMAT_BC6H_UF16;
|
||||
break;
|
||||
case wi::graphics::Format::BC6H_SF16:
|
||||
dds_format = dds_write::DXGI_FORMAT_BC6H_SF16;
|
||||
dds_format = dds::DXGI_FORMAT_BC6H_SF16;
|
||||
break;
|
||||
case wi::graphics::Format::BC7_UNORM:
|
||||
dds_format = dds_write::DXGI_FORMAT_BC7_UNORM;
|
||||
dds_format = dds::DXGI_FORMAT_BC7_UNORM;
|
||||
break;
|
||||
case wi::graphics::Format::BC7_UNORM_SRGB:
|
||||
dds_format = dds_write::DXGI_FORMAT_BC7_UNORM_SRGB;
|
||||
dds_format = dds::DXGI_FORMAT_BC7_UNORM_SRGB;
|
||||
break;
|
||||
default:
|
||||
assert(0);
|
||||
return false;
|
||||
}
|
||||
dds_write::write_header(
|
||||
dds::write_header(
|
||||
filedata.data(),
|
||||
dds_format,
|
||||
desc.width,
|
||||
@@ -429,7 +429,7 @@ namespace wi::helper
|
||||
has_flag(desc.misc_flags, ResourceMiscFlag::TEXTURECUBE),
|
||||
desc.type == TextureDesc::Type::TEXTURE_3D ? desc.depth : 0
|
||||
);
|
||||
std::memcpy(filedata.data() + sizeof(dds_write::Header), texturedata.data(), texturedata.size());
|
||||
std::memcpy(filedata.data() + sizeof(dds::Header), texturedata.data(), texturedata.size());
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -8,8 +8,8 @@
|
||||
|
||||
#include "Utility/qoi.h"
|
||||
#include "Utility/stb_image.h"
|
||||
#include "Utility/tinyddsloader.h"
|
||||
#include "Utility/basis_universal/transcoder/basisu_transcoder.h"
|
||||
#include "Utility/dds.h"
|
||||
|
||||
#include <algorithm>
|
||||
#include <mutex>
|
||||
@@ -657,24 +657,22 @@ namespace wi
|
||||
}
|
||||
else if (!ext.compare("DDS"))
|
||||
{
|
||||
tinyddsloader::DDSFile dds;
|
||||
auto result = dds.Load(filedata, filesize);
|
||||
|
||||
if (result == tinyddsloader::Result::Success)
|
||||
dds::Header header = dds::read_header(filedata, filesize);
|
||||
if (header.is_valid())
|
||||
{
|
||||
TextureDesc desc;
|
||||
desc.array_size = 1;
|
||||
desc.bind_flags = BindFlag::SHADER_RESOURCE;
|
||||
desc.width = dds.GetWidth();
|
||||
desc.height = dds.GetHeight();
|
||||
desc.depth = dds.GetDepth();
|
||||
desc.mip_levels = dds.GetMipCount();
|
||||
desc.array_size = dds.GetArraySize();
|
||||
desc.width = header.width();
|
||||
desc.height = header.height();
|
||||
desc.depth = header.depth();
|
||||
desc.mip_levels = header.mip_levels();
|
||||
desc.array_size = header.array_size();
|
||||
desc.format = Format::R8G8B8A8_UNORM;
|
||||
desc.layout = ResourceState::SHADER_RESOURCE;
|
||||
desc.misc_flags = ResourceMiscFlag::TYPED_FORMAT_CASTING;
|
||||
|
||||
if (dds.IsCubemap())
|
||||
if (header.is_cubemap())
|
||||
{
|
||||
desc.misc_flags |= ResourceMiscFlag::TEXTURECUBE;
|
||||
}
|
||||
@@ -684,73 +682,73 @@ namespace wi
|
||||
flags &= ~Flags::STREAMING;
|
||||
}
|
||||
|
||||
auto ddsFormat = dds.GetFormat();
|
||||
auto ddsFormat = header.format();
|
||||
|
||||
switch (ddsFormat)
|
||||
{
|
||||
case tinyddsloader::DDSFile::DXGIFormat::R32G32B32A32_Float: desc.format = Format::R32G32B32A32_FLOAT; break;
|
||||
case tinyddsloader::DDSFile::DXGIFormat::R32G32B32A32_UInt: desc.format = Format::R32G32B32A32_UINT; break;
|
||||
case tinyddsloader::DDSFile::DXGIFormat::R32G32B32A32_SInt: desc.format = Format::R32G32B32A32_SINT; break;
|
||||
case tinyddsloader::DDSFile::DXGIFormat::R32G32B32_Float: desc.format = Format::R32G32B32_FLOAT; break;
|
||||
case tinyddsloader::DDSFile::DXGIFormat::R32G32B32_UInt: desc.format = Format::R32G32B32_UINT; break;
|
||||
case tinyddsloader::DDSFile::DXGIFormat::R32G32B32_SInt: desc.format = Format::R32G32B32_SINT; break;
|
||||
case tinyddsloader::DDSFile::DXGIFormat::R16G16B16A16_Float: desc.format = Format::R16G16B16A16_FLOAT; break;
|
||||
case tinyddsloader::DDSFile::DXGIFormat::R16G16B16A16_UNorm: desc.format = Format::R16G16B16A16_UNORM; break;
|
||||
case tinyddsloader::DDSFile::DXGIFormat::R16G16B16A16_UInt: desc.format = Format::R16G16B16A16_UINT; break;
|
||||
case tinyddsloader::DDSFile::DXGIFormat::R16G16B16A16_SNorm: desc.format = Format::R16G16B16A16_SNORM; break;
|
||||
case tinyddsloader::DDSFile::DXGIFormat::R16G16B16A16_SInt: desc.format = Format::R16G16B16A16_SINT; break;
|
||||
case tinyddsloader::DDSFile::DXGIFormat::R32G32_Float: desc.format = Format::R32G32_FLOAT; break;
|
||||
case tinyddsloader::DDSFile::DXGIFormat::R32G32_UInt: desc.format = Format::R32G32_UINT; break;
|
||||
case tinyddsloader::DDSFile::DXGIFormat::R32G32_SInt: desc.format = Format::R32G32_SINT; break;
|
||||
case tinyddsloader::DDSFile::DXGIFormat::R10G10B10A2_UNorm: desc.format = Format::R10G10B10A2_UNORM; break;
|
||||
case tinyddsloader::DDSFile::DXGIFormat::R10G10B10A2_UInt: desc.format = Format::R10G10B10A2_UINT; break;
|
||||
case tinyddsloader::DDSFile::DXGIFormat::R11G11B10_Float: desc.format = Format::R11G11B10_FLOAT; break;
|
||||
case tinyddsloader::DDSFile::DXGIFormat::R9G9B9E5_SHAREDEXP: desc.format = Format::R9G9B9E5_SHAREDEXP; break;
|
||||
case tinyddsloader::DDSFile::DXGIFormat::B8G8R8X8_UNorm: desc.format = Format::B8G8R8A8_UNORM; break;
|
||||
case tinyddsloader::DDSFile::DXGIFormat::B8G8R8A8_UNorm: desc.format = Format::B8G8R8A8_UNORM; break;
|
||||
case tinyddsloader::DDSFile::DXGIFormat::B8G8R8A8_UNorm_SRGB: desc.format = Format::B8G8R8A8_UNORM_SRGB; break;
|
||||
case tinyddsloader::DDSFile::DXGIFormat::R8G8B8A8_UNorm: desc.format = Format::R8G8B8A8_UNORM; break;
|
||||
case tinyddsloader::DDSFile::DXGIFormat::R8G8B8A8_UNorm_SRGB: desc.format = Format::R8G8B8A8_UNORM_SRGB; break;
|
||||
case tinyddsloader::DDSFile::DXGIFormat::R8G8B8A8_UInt: desc.format = Format::R8G8B8A8_UINT; break;
|
||||
case tinyddsloader::DDSFile::DXGIFormat::R8G8B8A8_SNorm: desc.format = Format::R8G8B8A8_SNORM; break;
|
||||
case tinyddsloader::DDSFile::DXGIFormat::R8G8B8A8_SInt: desc.format = Format::R8G8B8A8_SINT; break;
|
||||
case tinyddsloader::DDSFile::DXGIFormat::R16G16_Float: desc.format = Format::R16G16_FLOAT; break;
|
||||
case tinyddsloader::DDSFile::DXGIFormat::R16G16_UNorm: desc.format = Format::R16G16_UNORM; break;
|
||||
case tinyddsloader::DDSFile::DXGIFormat::R16G16_UInt: desc.format = Format::R16G16_UINT; break;
|
||||
case tinyddsloader::DDSFile::DXGIFormat::R16G16_SNorm: desc.format = Format::R16G16_SNORM; break;
|
||||
case tinyddsloader::DDSFile::DXGIFormat::R16G16_SInt: desc.format = Format::R16G16_SINT; break;
|
||||
case tinyddsloader::DDSFile::DXGIFormat::D32_Float: desc.format = Format::D32_FLOAT; break;
|
||||
case tinyddsloader::DDSFile::DXGIFormat::R32_Float: desc.format = Format::R32_FLOAT; break;
|
||||
case tinyddsloader::DDSFile::DXGIFormat::R32_UInt: desc.format = Format::R32_UINT; break;
|
||||
case tinyddsloader::DDSFile::DXGIFormat::R32_SInt: desc.format = Format::R32_SINT; break;
|
||||
case tinyddsloader::DDSFile::DXGIFormat::R8G8_UNorm: desc.format = Format::R8G8_UNORM; break;
|
||||
case tinyddsloader::DDSFile::DXGIFormat::R8G8_UInt: desc.format = Format::R8G8_UINT; break;
|
||||
case tinyddsloader::DDSFile::DXGIFormat::R8G8_SNorm: desc.format = Format::R8G8_SNORM; break;
|
||||
case tinyddsloader::DDSFile::DXGIFormat::R8G8_SInt: desc.format = Format::R8G8_SINT; break;
|
||||
case tinyddsloader::DDSFile::DXGIFormat::R16_Float: desc.format = Format::R16_FLOAT; break;
|
||||
case tinyddsloader::DDSFile::DXGIFormat::D16_UNorm: desc.format = Format::D16_UNORM; break;
|
||||
case tinyddsloader::DDSFile::DXGIFormat::R16_UNorm: desc.format = Format::R16_UNORM; break;
|
||||
case tinyddsloader::DDSFile::DXGIFormat::R16_UInt: desc.format = Format::R16_UINT; break;
|
||||
case tinyddsloader::DDSFile::DXGIFormat::R16_SNorm: desc.format = Format::R16_SNORM; break;
|
||||
case tinyddsloader::DDSFile::DXGIFormat::R16_SInt: desc.format = Format::R16_SINT; break;
|
||||
case tinyddsloader::DDSFile::DXGIFormat::R8_UNorm: desc.format = Format::R8_UNORM; break;
|
||||
case tinyddsloader::DDSFile::DXGIFormat::R8_UInt: desc.format = Format::R8_UINT; break;
|
||||
case tinyddsloader::DDSFile::DXGIFormat::R8_SNorm: desc.format = Format::R8_SNORM; break;
|
||||
case tinyddsloader::DDSFile::DXGIFormat::R8_SInt: desc.format = Format::R8_SINT; break;
|
||||
case tinyddsloader::DDSFile::DXGIFormat::BC1_UNorm: desc.format = Format::BC1_UNORM; break;
|
||||
case tinyddsloader::DDSFile::DXGIFormat::BC1_UNorm_SRGB: desc.format = Format::BC1_UNORM_SRGB; break;
|
||||
case tinyddsloader::DDSFile::DXGIFormat::BC2_UNorm: desc.format = Format::BC2_UNORM; break;
|
||||
case tinyddsloader::DDSFile::DXGIFormat::BC2_UNorm_SRGB: desc.format = Format::BC2_UNORM_SRGB; break;
|
||||
case tinyddsloader::DDSFile::DXGIFormat::BC3_UNorm: desc.format = Format::BC3_UNORM; break;
|
||||
case tinyddsloader::DDSFile::DXGIFormat::BC3_UNorm_SRGB: desc.format = Format::BC3_UNORM_SRGB; break;
|
||||
case tinyddsloader::DDSFile::DXGIFormat::BC4_UNorm: desc.format = Format::BC4_UNORM; break;
|
||||
case tinyddsloader::DDSFile::DXGIFormat::BC4_SNorm: desc.format = Format::BC4_SNORM; break;
|
||||
case tinyddsloader::DDSFile::DXGIFormat::BC5_UNorm: desc.format = Format::BC5_UNORM; break;
|
||||
case tinyddsloader::DDSFile::DXGIFormat::BC5_SNorm: desc.format = Format::BC5_SNORM; break;
|
||||
case tinyddsloader::DDSFile::DXGIFormat::BC6H_SF16: desc.format = Format::BC6H_SF16; break;
|
||||
case tinyddsloader::DDSFile::DXGIFormat::BC6H_UF16: desc.format = Format::BC6H_UF16; break;
|
||||
case tinyddsloader::DDSFile::DXGIFormat::BC7_UNorm: desc.format = Format::BC7_UNORM; break;
|
||||
case tinyddsloader::DDSFile::DXGIFormat::BC7_UNorm_SRGB: desc.format = Format::BC7_UNORM_SRGB; break;
|
||||
case dds::DXGI_FORMAT_R32G32B32A32_FLOAT: desc.format = Format::R32G32B32A32_FLOAT; break;
|
||||
case dds::DXGI_FORMAT_R32G32B32A32_UINT: desc.format = Format::R32G32B32A32_UINT; break;
|
||||
case dds::DXGI_FORMAT_R32G32B32A32_SINT: desc.format = Format::R32G32B32A32_SINT; break;
|
||||
case dds::DXGI_FORMAT_R32G32B32_FLOAT: desc.format = Format::R32G32B32_FLOAT; break;
|
||||
case dds::DXGI_FORMAT_R32G32B32_UINT: desc.format = Format::R32G32B32_UINT; break;
|
||||
case dds::DXGI_FORMAT_R32G32B32_SINT: desc.format = Format::R32G32B32_SINT; break;
|
||||
case dds::DXGI_FORMAT_R16G16B16A16_FLOAT: desc.format = Format::R16G16B16A16_FLOAT; break;
|
||||
case dds::DXGI_FORMAT_R16G16B16A16_UNORM: desc.format = Format::R16G16B16A16_UNORM; break;
|
||||
case dds::DXGI_FORMAT_R16G16B16A16_UINT: desc.format = Format::R16G16B16A16_UINT; break;
|
||||
case dds::DXGI_FORMAT_R16G16B16A16_SNORM: desc.format = Format::R16G16B16A16_SNORM; break;
|
||||
case dds::DXGI_FORMAT_R16G16B16A16_SINT: desc.format = Format::R16G16B16A16_SINT; break;
|
||||
case dds::DXGI_FORMAT_R32G32_FLOAT: desc.format = Format::R32G32_FLOAT; break;
|
||||
case dds::DXGI_FORMAT_R32G32_UINT: desc.format = Format::R32G32_UINT; break;
|
||||
case dds::DXGI_FORMAT_R32G32_SINT: desc.format = Format::R32G32_SINT; break;
|
||||
case dds::DXGI_FORMAT_R10G10B10A2_UNORM: desc.format = Format::R10G10B10A2_UNORM; break;
|
||||
case dds::DXGI_FORMAT_R10G10B10A2_UINT: desc.format = Format::R10G10B10A2_UINT; break;
|
||||
case dds::DXGI_FORMAT_R11G11B10_FLOAT: desc.format = Format::R11G11B10_FLOAT; break;
|
||||
case dds::DXGI_FORMAT_R9G9B9E5_SHAREDEXP: desc.format = Format::R9G9B9E5_SHAREDEXP; break;
|
||||
case dds::DXGI_FORMAT_B8G8R8X8_UNORM: desc.format = Format::B8G8R8A8_UNORM; break;
|
||||
case dds::DXGI_FORMAT_B8G8R8A8_UNORM: desc.format = Format::B8G8R8A8_UNORM; break;
|
||||
case dds::DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: desc.format = Format::B8G8R8A8_UNORM_SRGB; break;
|
||||
case dds::DXGI_FORMAT_R8G8B8A8_UNORM: desc.format = Format::R8G8B8A8_UNORM; break;
|
||||
case dds::DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: desc.format = Format::R8G8B8A8_UNORM_SRGB; break;
|
||||
case dds::DXGI_FORMAT_R8G8B8A8_UINT: desc.format = Format::R8G8B8A8_UINT; break;
|
||||
case dds::DXGI_FORMAT_R8G8B8A8_SNORM: desc.format = Format::R8G8B8A8_SNORM; break;
|
||||
case dds::DXGI_FORMAT_R8G8B8A8_SINT: desc.format = Format::R8G8B8A8_SINT; break;
|
||||
case dds::DXGI_FORMAT_R16G16_FLOAT: desc.format = Format::R16G16_FLOAT; break;
|
||||
case dds::DXGI_FORMAT_R16G16_UNORM: desc.format = Format::R16G16_UNORM; break;
|
||||
case dds::DXGI_FORMAT_R16G16_UINT: desc.format = Format::R16G16_UINT; break;
|
||||
case dds::DXGI_FORMAT_R16G16_SNORM: desc.format = Format::R16G16_SNORM; break;
|
||||
case dds::DXGI_FORMAT_R16G16_SINT: desc.format = Format::R16G16_SINT; break;
|
||||
case dds::DXGI_FORMAT_D32_FLOAT: desc.format = Format::D32_FLOAT; break;
|
||||
case dds::DXGI_FORMAT_R32_FLOAT: desc.format = Format::R32_FLOAT; break;
|
||||
case dds::DXGI_FORMAT_R32_UINT: desc.format = Format::R32_UINT; break;
|
||||
case dds::DXGI_FORMAT_R32_SINT: desc.format = Format::R32_SINT; break;
|
||||
case dds::DXGI_FORMAT_R8G8_UNORM: desc.format = Format::R8G8_UNORM; break;
|
||||
case dds::DXGI_FORMAT_R8G8_UINT: desc.format = Format::R8G8_UINT; break;
|
||||
case dds::DXGI_FORMAT_R8G8_SNORM: desc.format = Format::R8G8_SNORM; break;
|
||||
case dds::DXGI_FORMAT_R8G8_SINT: desc.format = Format::R8G8_SINT; break;
|
||||
case dds::DXGI_FORMAT_R16_FLOAT: desc.format = Format::R16_FLOAT; break;
|
||||
case dds::DXGI_FORMAT_D16_UNORM: desc.format = Format::D16_UNORM; break;
|
||||
case dds::DXGI_FORMAT_R16_UNORM: desc.format = Format::R16_UNORM; break;
|
||||
case dds::DXGI_FORMAT_R16_UINT: desc.format = Format::R16_UINT; break;
|
||||
case dds::DXGI_FORMAT_R16_SNORM: desc.format = Format::R16_SNORM; break;
|
||||
case dds::DXGI_FORMAT_R16_SINT: desc.format = Format::R16_SINT; break;
|
||||
case dds::DXGI_FORMAT_R8_UNORM: desc.format = Format::R8_UNORM; break;
|
||||
case dds::DXGI_FORMAT_R8_UINT: desc.format = Format::R8_UINT; break;
|
||||
case dds::DXGI_FORMAT_R8_SNORM: desc.format = Format::R8_SNORM; break;
|
||||
case dds::DXGI_FORMAT_R8_SINT: desc.format = Format::R8_SINT; break;
|
||||
case dds::DXGI_FORMAT_BC1_UNORM: desc.format = Format::BC1_UNORM; break;
|
||||
case dds::DXGI_FORMAT_BC1_UNORM_SRGB: desc.format = Format::BC1_UNORM_SRGB; break;
|
||||
case dds::DXGI_FORMAT_BC2_UNORM: desc.format = Format::BC2_UNORM; break;
|
||||
case dds::DXGI_FORMAT_BC2_UNORM_SRGB: desc.format = Format::BC2_UNORM_SRGB; break;
|
||||
case dds::DXGI_FORMAT_BC3_UNORM: desc.format = Format::BC3_UNORM; break;
|
||||
case dds::DXGI_FORMAT_BC3_UNORM_SRGB: desc.format = Format::BC3_UNORM_SRGB; break;
|
||||
case dds::DXGI_FORMAT_BC4_UNORM: desc.format = Format::BC4_UNORM; break;
|
||||
case dds::DXGI_FORMAT_BC4_SNORM: desc.format = Format::BC4_SNORM; break;
|
||||
case dds::DXGI_FORMAT_BC5_UNORM: desc.format = Format::BC5_UNORM; break;
|
||||
case dds::DXGI_FORMAT_BC5_SNORM: desc.format = Format::BC5_SNORM; break;
|
||||
case dds::DXGI_FORMAT_BC6H_SF16: desc.format = Format::BC6H_SF16; break;
|
||||
case dds::DXGI_FORMAT_BC6H_UF16: desc.format = Format::BC6H_UF16; break;
|
||||
case dds::DXGI_FORMAT_BC7_UNORM: desc.format = Format::BC7_UNORM; break;
|
||||
case dds::DXGI_FORMAT_BC7_UNORM_SRGB: desc.format = Format::BC7_UNORM_SRGB; break;
|
||||
default:
|
||||
assert(0); // incoming format is not supported
|
||||
break;
|
||||
@@ -766,49 +764,25 @@ namespace wi
|
||||
|
||||
wi::vector<SubresourceData> initdata;
|
||||
initdata.reserve(desc.array_size * desc.mip_levels);
|
||||
for (uint32_t arrayIndex = 0; arrayIndex < desc.array_size; ++arrayIndex)
|
||||
for (uint32_t slice = 0; slice < desc.array_size; ++slice)
|
||||
{
|
||||
for (uint32_t mip = 0; mip < desc.mip_levels; ++mip)
|
||||
{
|
||||
auto imageData = dds.GetImageData(mip, arrayIndex);
|
||||
SubresourceData& subresourceData = initdata.emplace_back();
|
||||
subresourceData.data_ptr = imageData->m_mem;
|
||||
subresourceData.row_pitch = imageData->m_memPitch;
|
||||
subresourceData.slice_pitch = imageData->m_memSlicePitch;
|
||||
|
||||
if (has_flag(flags, Flags::STREAMING))
|
||||
{
|
||||
// For streaming, remember relative memory offsets for mip levels:
|
||||
auto& streaming_data = resource->streaming_texture.streaming_data[mip];
|
||||
streaming_data.data_offset = (size_t)subresourceData.data_ptr - (size_t)filedata;
|
||||
streaming_data.row_pitch = subresourceData.row_pitch;
|
||||
streaming_data.slice_pitch = subresourceData.slice_pitch;
|
||||
}
|
||||
subresourceData.data_ptr = filedata + header.mip_offset(mip, slice);
|
||||
subresourceData.row_pitch = header.row_pitch(mip);
|
||||
subresourceData.slice_pitch = header.slice_pitch(mip);
|
||||
}
|
||||
}
|
||||
|
||||
auto dim = dds.GetTextureDimension();
|
||||
switch (dim)
|
||||
{
|
||||
case tinyddsloader::DDSFile::TextureDimension::Texture1D:
|
||||
if (header.is_1d())
|
||||
{
|
||||
desc.type = TextureDesc::Type::TEXTURE_1D;
|
||||
}
|
||||
break;
|
||||
case tinyddsloader::DDSFile::TextureDimension::Texture2D:
|
||||
{
|
||||
desc.type = TextureDesc::Type::TEXTURE_2D;
|
||||
}
|
||||
break;
|
||||
case tinyddsloader::DDSFile::TextureDimension::Texture3D:
|
||||
else if (header.is_3d())
|
||||
{
|
||||
desc.type = TextureDesc::Type::TEXTURE_3D;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
assert(0);
|
||||
break;
|
||||
}
|
||||
|
||||
if (IsFormatBlockCompressed(desc.format))
|
||||
{
|
||||
@@ -820,6 +794,17 @@ namespace wi
|
||||
int mip_offset = 0;
|
||||
if (has_flag(flags, Flags::STREAMING))
|
||||
{
|
||||
// For streaming, remember relative memory offsets for mip levels:
|
||||
for (uint32_t slice = 0; slice < desc.array_size; ++slice)
|
||||
{
|
||||
for (uint32_t mip = 0; mip < desc.mip_levels; ++mip)
|
||||
{
|
||||
auto& streaming_data = resource->streaming_texture.streaming_data[mip];
|
||||
streaming_data.data_offset = header.mip_offset(mip, slice);
|
||||
streaming_data.row_pitch = header.row_pitch(mip);
|
||||
streaming_data.slice_pitch = header.slice_pitch(mip);
|
||||
}
|
||||
}
|
||||
while (desc.mip_levels > 1 && desc.depth == 1 && desc.array_size == 1 && ComputeTextureMemorySizeInBytes(desc) > streaming_texture_min_size)
|
||||
{
|
||||
desc.width >>= 1;
|
||||
|
||||
@@ -9,7 +9,7 @@ namespace wi::version
|
||||
// minor features, major updates, breaking compatibility changes
|
||||
const int minor = 71;
|
||||
// minor bug fixes, alterations, refactors, updates
|
||||
const int revision = 473;
|
||||
const int revision = 474;
|
||||
|
||||
const std::string version_string = std::to_string(major) + "." + std::to_string(minor) + "." + std::to_string(revision);
|
||||
|
||||
|
||||
@@ -133,32 +133,6 @@ THE SOFTWARE.
|
||||
|
||||
###############################################################################################################################
|
||||
|
||||
benikabocha/tinyddsloader: https://github.com/benikabocha/tinyddsloader
|
||||
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2018 benikabocha
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
|
||||
###############################################################################################################################
|
||||
|
||||
Vulkan Memory Allocator: https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator
|
||||
|
||||
The MIT License (MIT)
|
||||
|
||||
Reference in New Issue
Block a user