Foundation
Loading...
Searching...
No Matches
Texture.hpp
Go to the documentation of this file.
1#pragma once
2#include <Core/Container.hpp>
3#include <Math/Math.hpp>
5#include "Serialization.hpp"
6#include "TextureDDS.hpp"
7using namespace Foundation;
8using namespace RHI;
9using namespace Core;
10using namespace Math;
11
13{
17
18 [[nodiscard]] bool IsValid() const { return magic == DDS_MAGIC && GetSize() != 0; }
19 [[nodiscard]] uint32_t GetWidth() const { return header.width; }
20 [[nodiscard]] uint32_t GetHeight() const { return header.height; }
21 [[nodiscard]] uint32_t GetDepth() const;
25 {
27 return 6;
29 return header10.arraySize;
30 return 1;
31 }
35 [[nodiscard]] uint32_t GetBpp() const;
37 uint32_t mipLevels, uint32_t blockSize,
39 [[nodiscard]] uint32_t GetSize() const;
40 [[nodiscard]] size_t GetSubresourceSize(uint32_t layer, uint32_t mip) const;
41 [[nodiscard]] RHIExtent3D GetMipExtent(uint32_t mipLevel) const;
43};
44
46{
48
50 : subresources(alloc)
51 {
52 }
53
55
57 {
58 CHECK_MSG(layer < GetNumLayers(), "Texture layer {} out of range {}", layer, GetNumLayers());
59 CHECK_MSG(mip < GetNumMips(), "Texture mip {} out of range {}", mip, GetNumMips());
60 return layer * GetNumMips() + mip;
61 }
62
64 {
65 uint32_t const index = GetSubresourceIndex(layer, mip);
66 CHECK_MSG(index < subresources.size(), "Texture subresource {} missing from serialized texture", index);
67 return subresources[index];
68 }
69
70 [[nodiscard]] bool IsValid() const
71 {
72 return FTextureHeader::IsValid() && subresources.size() == GetSubresourceCount() && !subresources.empty();
73 }
74};
75
77{
79
80 FTexture(Allocator* alloc);
81 void Initialize(RHIResourceFormat format, RHITextureDimension dimension, uint32_t width, uint32_t height = 1,
82 uint32_t depth = 1, uint32_t mipCount = 1, uint32_t layerCount = 1);
83 [[nodiscard]] bool IsValid() const { return FTextureHeader::IsValid() && bytes.size() == GetSize(); }
84 // Get raw subresource slice that can be uploaded to the GPU directly
86
90 void GenerateMips();
95
97 {
98 FSerializedTexture texture(alloc);
99 texture.magic = magic;
100 texture.header = header;
101 texture.header10 = header10;
102 return texture;
103 }
104};
105
110void LoadDDS(FTexture& texture, StringView path);
116void LoadRGBA8(FTexture& texture, StringView path, bool gamma = true);
122void LoadRGBA8(FTexture& texture, Span<const unsigned char> data, bool gamma = true);
127void LoadHDR(FTexture& texture, StringView path);
136void SaveHDR(const float* data, int width, int height, StringView path);
144void SavePNG(const unsigned char* data, int width, int height, StringView path);
145/* -- Serialization -- */
146template <>
148{
149 FTextureHeader const& header = obj;
150 FSerialize(w, header.magic);
151 FSerialize(w, header.header);
152 FSerialize(w, header.header10);
153 FSerialize(w, obj.subresources);
154}
155
156template <>
158{
159 FTextureHeader& header = obj;
160 FDeserialize(r, header.magic);
161 FDeserialize(r, header.header);
162 FDeserialize(r, header.header10);
163 FDeserialize(r, obj.subresources);
164}
165
166template <>
167inline void FSerialize(FWriter& w, FTexture const& obj)
168{
169 FSerialize(w, obj.magic);
170 FSerialize(w, obj.header);
171 if (obj.header.ddspf.fourCC == DDSPF_DX10.fourCC)
172 FSerialize(w, obj.header10);
173 CHECK(w.write(obj.bytes.data(), obj.bytes.size()) == obj.bytes.size());
174}
175template <>
177{
178 FDeserialize(r, obj.magic);
179 CHECK(obj.magic == DDS_MAGIC);
180 FDeserialize(r, obj.header);
181 if (obj.header.ddspf.fourCC == DDSPF_DX10.fourCC)
182 FDeserialize(r, obj.header10);
183 obj.bytes.resize(obj.GetSize());
184 CHECK(r.read(obj.bytes.data(), obj.bytes.size()) == obj.bytes.size());
185}
#define GLOBAL_ALLOC
Definition Allocator.hpp:225
#define CHECK(expr)
Definition Logging.hpp:57
#define CHECK_MSG(expr, format_str,...)
Definition Logging.hpp:62
#define DDS_CUBEMAP
Definition TextureDDS.hpp:305
constexpr uint32_t DDS_MAGIC
Definition TextureDDS.hpp:135
constexpr DDS_PIXELFORMAT DDSPF_DX10
Definition TextureDDS.hpp:278
void FSerialize(FWriter &w, FSerializedTexture const &obj)
Definition Texture.hpp:147
void SaveHDR(const float *data, int width, int height, StringView path)
Definition Texture.cpp:408
void LoadHDR(FTexture &texture, StringView path)
Definition Texture.cpp:394
void FDeserialize(FReader &r, FSerializedTexture &obj)
Definition Texture.hpp:157
void LoadDDS(FTexture &texture, StringView path)
Definition Texture.cpp:364
void LoadRGBA8(FTexture &texture, StringView path, bool gamma=true)
Definition Texture.cpp:371
void SavePNG(const unsigned char *data, int width, int height, StringView path)
Definition Texture.cpp:422
General Purpose Allocator (GPA) interface.
Definition Allocator.hpp:24
Scoped move-only RAII handle wrapper for RHI Objects.
Definition Details.hpp:86
std::basic_string_view< char > StringView
Alias for std::basic_string_view<char>
Definition Container.hpp:55
RHIScopedHandle< RHIDevice, T > RHIDeviceScopedHandle
Definition Details.hpp:209
glm::vec< 3, uint32_t > RHIExtent3D
Definition Common.hpp:11
RHITextureDimension
Definition Common.hpp:243
RHIResourceFormat
Definition Common.hpp:34
Definition Allocator.hpp:5
Definition TextureDDS.hpp:355
uint32_t arraySize
Definition TextureDDS.hpp:359
Definition TextureDDS.hpp:337
uint32_t mipMapCount
Definition TextureDDS.hpp:344
uint32_t width
Definition TextureDDS.hpp:341
uint32_t height
Definition TextureDDS.hpp:340
uint32_t caps2
Definition TextureDDS.hpp:348
Definition Serialization.hpp:26
Definition Serialization.hpp:44
Definition Texture.hpp:46
uint32_t GetSubresourceIndex(uint32_t layer, uint32_t mip) const
Definition Texture.hpp:56
FSerializedTexture(Allocator *alloc=GLOBAL_ALLOC)
Definition Texture.hpp:49
bool IsValid() const
Definition Texture.hpp:70
Vector< FBlobRef > subresources
Definition Texture.hpp:47
uint32_t GetSubresourceCount() const
Definition Texture.hpp:54
FBlobRef const & GetSubresourceBlob(uint32_t layer, uint32_t mip) const
Definition Texture.hpp:63
Definition Texture.hpp:13
uint32_t GetNumMips() const
Definition Texture.hpp:32
RHITextureDimension GetDimension() const
Definition Texture.cpp:27
RHIResourceFormat GetFormat() const
Definition Texture.cpp:63
uint32_t GetNumLayers() const
Definition Texture.hpp:24
uint32_t GetBpp() const
Definition Texture.cpp:188
DDS_HEADER_DXT10 header10
Definition Texture.hpp:16
uint32_t GetSize() const
Definition Texture.cpp:214
uint32_t magic
Definition Texture.hpp:14
RHITextureDesc GetDesc() const
Definition Texture.cpp:246
uint32_t GetBlockSize() const
Definition Texture.cpp:159
uint32_t GetWidth() const
Definition Texture.hpp:19
bool IsValid() const
Definition Texture.hpp:18
size_t GetSubresourceSize(uint32_t layer, uint32_t mip) const
Definition Texture.cpp:224
static uint64_t CalculateTextureImageSize(uint32_t width, uint32_t height, uint32_t depth, uint32_t mipLevels, uint32_t blockSize, uint32_t blockDim)
Definition Texture.cpp:144
RHITextureDimension GetViewDimension() const
Definition Texture.cpp:45
DDS_HEADER header
Definition Texture.hpp:15
uint32_t GetDepth() const
Definition Texture.cpp:59
RHIExtent3D GetMipExtent(uint32_t mipLevel) const
Definition Texture.cpp:238
uint32_t GetHeight() const
Definition Texture.hpp:20
Definition Texture.hpp:77
void GenerateMips()
Definition Texture.cpp:279
Vector< unsigned char > bytes
Definition Texture.hpp:78
bool IsValid() const
Definition Texture.hpp:83
Span< unsigned char > GetSubresource(uint32_t mipLevel=0, uint32_t arrayLayer=0) const
Definition Texture.cpp:260
void Initialize(RHIResourceFormat format, RHITextureDimension dimension, uint32_t width, uint32_t height=1, uint32_t depth=1, uint32_t mipCount=1, uint32_t layerCount=1)
Definition Texture.cpp:13
FSerializedTexture ToSerializedTexture(Allocator *alloc=GLOBAL_ALLOC) const
Definition Texture.hpp:96
FTexture EncodeBC7(Allocator *alloc=GLOBAL_ALLOC) const
Definition Texture.cpp:429
Definition Serialization.hpp:36
virtual size_t write(const void *data, size_t size)=0
Definition Resource.hpp:142