Skip to content

Commit

Permalink
First iterations of tonemapping LUT
Browse files Browse the repository at this point in the history
  • Loading branch information
Devaniti committed Feb 22, 2024
1 parent 02855c2 commit 469bb1d
Show file tree
Hide file tree
Showing 29 changed files with 619 additions and 114 deletions.
272 changes: 272 additions & 0 deletions D3D12Backend/APIWrappers/Resources/Textures/Texture1D.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,272 @@
#include "stdafx.h"

#include "Texture1D.h"

#include "APIWrappers/Device.h"
#include "APIWrappers/ResourceHeap.h"

namespace Boolka
{

bool Texture1D::Initialize(ID3D12Resource* resource)
{
BLK_ASSERT(m_Resource == nullptr);
#ifdef BLK_DEBUG
D3D12_RESOURCE_DESC resourceDesc = resource->GetDesc();
BLK_ASSERT(resourceDesc.Dimension == D3D12_RESOURCE_DIMENSION_TEXTURE1D);
#endif

m_Resource = resource;

return true;
}

bool Texture1D::Initialize(Device& device, D3D12_HEAP_TYPE heapType, UINT64 width,
UINT16 mipCount, DXGI_FORMAT format,
D3D12_RESOURCE_FLAGS resourceFlags, D3D12_CLEAR_VALUE* clearValue,
D3D12_RESOURCE_STATES initialState, UINT16 arraySize /*= 1*/)
{
BLK_ASSERT(m_Resource == nullptr);

D3D12_HEAP_PROPERTIES heapProperties = {};
heapProperties.Type = heapType;
heapProperties.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN;
heapProperties.MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN;

D3D12_RESOURCE_DESC resourceDesc =
FillDesc(width, mipCount, format, resourceFlags, arraySize);

HRESULT hr =
device->CreateCommittedResource(&heapProperties, D3D12_HEAP_FLAG_NONE, &resourceDesc,
initialState, clearValue, IID_PPV_ARGS(&m_Resource));
BLK_ASSERT(SUCCEEDED(hr));
return SUCCEEDED(hr);
}

bool Texture1D::Initialize(Device& device, ResourceHeap& resourceHeap, size_t heapOffset,
UINT64 width, UINT16 mipCount, DXGI_FORMAT format,
D3D12_RESOURCE_FLAGS resourceFlags, D3D12_CLEAR_VALUE* clearValue,
D3D12_RESOURCE_STATES initialState, UINT16 arraySize /*= 1*/)
{
D3D12_RESOURCE_DESC resourceDesc =
FillDesc(width, mipCount, format, resourceFlags, arraySize);

HRESULT hr =
device->CreatePlacedResource(resourceHeap.Get(), heapOffset, &resourceDesc,
initialState, clearValue, IID_PPV_ARGS(&m_Resource));
BLK_ASSERT(SUCCEEDED(hr));
return SUCCEEDED(hr);
}

void Texture1D::GetRequiredSize(size_t& outAlignment, size_t& outSize, Device& device,
UINT64 width, UINT16 mipCount, DXGI_FORMAT format,
D3D12_RESOURCE_FLAGS resourceFlags, UINT16 arraySize /*= 1*/)
{
D3D12_RESOURCE_DESC resourceDesc =
FillDesc(width, mipCount, format, resourceFlags, arraySize);

D3D12_RESOURCE_ALLOCATION_INFO allocationInfo =
device->GetResourceAllocationInfo(0, 1, &resourceDesc);
outAlignment = allocationInfo.Alignment;
outSize = allocationInfo.SizeInBytes;
}

size_t Texture1D::GetUploadSize(UINT width, UINT16 mipCount, DXGI_FORMAT format,
D3D12_RESOURCE_FLAGS resourceFlags, UINT16 arraySize /*= 1*/)
{
size_t result = 0;

UINT bytesPerPixel = GetBPP(format) / 8;
BLK_ASSERT(bytesPerPixel > 0);

UINT currentWidth = width;
for (UINT16 currentMip = 0; currentMip < mipCount; ++currentMip)
{
BLK_ASSERT(currentWidth != 0);

size_t rowPitch = BLK_CEIL_TO_POWER_OF_TWO(currentWidth * bytesPerPixel,
D3D12_TEXTURE_DATA_PITCH_ALIGNMENT);
size_t textureSize = BLK_CEIL_TO_POWER_OF_TWO(rowPitch,
D3D12_TEXTURE_DATA_PLACEMENT_ALIGNMENT);
result += textureSize;
currentWidth >>= 1;
}

return result * arraySize;
}

UINT Texture1D::GetBPP(DXGI_FORMAT format)
{
switch (format)
{
case DXGI_FORMAT_R32G32B32A32_TYPELESS:
case DXGI_FORMAT_R32G32B32A32_FLOAT:
case DXGI_FORMAT_R32G32B32A32_UINT:
case DXGI_FORMAT_R32G32B32A32_SINT:
return 128;

case DXGI_FORMAT_R32G32B32_TYPELESS:
case DXGI_FORMAT_R32G32B32_FLOAT:
case DXGI_FORMAT_R32G32B32_UINT:
case DXGI_FORMAT_R32G32B32_SINT:
return 96;

case DXGI_FORMAT_R16G16B16A16_TYPELESS:
case DXGI_FORMAT_R16G16B16A16_FLOAT:
case DXGI_FORMAT_R16G16B16A16_UNORM:
case DXGI_FORMAT_R16G16B16A16_UINT:
case DXGI_FORMAT_R16G16B16A16_SNORM:
case DXGI_FORMAT_R16G16B16A16_SINT:
case DXGI_FORMAT_R32G32_TYPELESS:
case DXGI_FORMAT_R32G32_FLOAT:
case DXGI_FORMAT_R32G32_UINT:
case DXGI_FORMAT_R32G32_SINT:
case DXGI_FORMAT_R32G8X24_TYPELESS:
case DXGI_FORMAT_D32_FLOAT_S8X24_UINT:
case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS:
case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT:
case DXGI_FORMAT_Y416:
case DXGI_FORMAT_Y210:
case DXGI_FORMAT_Y216:
return 64;

case DXGI_FORMAT_R10G10B10A2_TYPELESS:
case DXGI_FORMAT_R10G10B10A2_UNORM:
case DXGI_FORMAT_R10G10B10A2_UINT:
case DXGI_FORMAT_R11G11B10_FLOAT:
case DXGI_FORMAT_R8G8B8A8_TYPELESS:
case DXGI_FORMAT_R8G8B8A8_UNORM:
case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB:
case DXGI_FORMAT_R8G8B8A8_UINT:
case DXGI_FORMAT_R8G8B8A8_SNORM:
case DXGI_FORMAT_R8G8B8A8_SINT:
case DXGI_FORMAT_R16G16_TYPELESS:
case DXGI_FORMAT_R16G16_FLOAT:
case DXGI_FORMAT_R16G16_UNORM:
case DXGI_FORMAT_R16G16_UINT:
case DXGI_FORMAT_R16G16_SNORM:
case DXGI_FORMAT_R16G16_SINT:
case DXGI_FORMAT_R32_TYPELESS:
case DXGI_FORMAT_D32_FLOAT:
case DXGI_FORMAT_R32_FLOAT:
case DXGI_FORMAT_R32_UINT:
case DXGI_FORMAT_R32_SINT:
case DXGI_FORMAT_R24G8_TYPELESS:
case DXGI_FORMAT_D24_UNORM_S8_UINT:
case DXGI_FORMAT_R24_UNORM_X8_TYPELESS:
case DXGI_FORMAT_X24_TYPELESS_G8_UINT:
case DXGI_FORMAT_R9G9B9E5_SHAREDEXP:
case DXGI_FORMAT_R8G8_B8G8_UNORM:
case DXGI_FORMAT_G8R8_G8B8_UNORM:
case DXGI_FORMAT_B8G8R8A8_UNORM:
case DXGI_FORMAT_B8G8R8X8_UNORM:
case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM:
case DXGI_FORMAT_B8G8R8A8_TYPELESS:
case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB:
case DXGI_FORMAT_B8G8R8X8_TYPELESS:
case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB:
case DXGI_FORMAT_AYUV:
case DXGI_FORMAT_Y410:
case DXGI_FORMAT_YUY2:
return 32;

case DXGI_FORMAT_P010:
case DXGI_FORMAT_P016:
return 24;

case DXGI_FORMAT_R8G8_TYPELESS:
case DXGI_FORMAT_R8G8_UNORM:
case DXGI_FORMAT_R8G8_UINT:
case DXGI_FORMAT_R8G8_SNORM:
case DXGI_FORMAT_R8G8_SINT:
case DXGI_FORMAT_R16_TYPELESS:
case DXGI_FORMAT_R16_FLOAT:
case DXGI_FORMAT_D16_UNORM:
case DXGI_FORMAT_R16_UNORM:
case DXGI_FORMAT_R16_UINT:
case DXGI_FORMAT_R16_SNORM:
case DXGI_FORMAT_R16_SINT:
case DXGI_FORMAT_B5G6R5_UNORM:
case DXGI_FORMAT_B5G5R5A1_UNORM:
case DXGI_FORMAT_A8P8:
case DXGI_FORMAT_B4G4R4A4_UNORM:
return 16;

case DXGI_FORMAT_NV12:
case DXGI_FORMAT_420_OPAQUE:
case DXGI_FORMAT_NV11:
return 12;

case DXGI_FORMAT_R8_TYPELESS:
case DXGI_FORMAT_R8_UNORM:
case DXGI_FORMAT_R8_UINT:
case DXGI_FORMAT_R8_SNORM:
case DXGI_FORMAT_R8_SINT:
case DXGI_FORMAT_A8_UNORM:
case DXGI_FORMAT_AI44:
case DXGI_FORMAT_IA44:
case DXGI_FORMAT_P8:
return 8;

case DXGI_FORMAT_R1_UNORM:
return 1;

case DXGI_FORMAT_BC1_TYPELESS:
case DXGI_FORMAT_BC1_UNORM:
case DXGI_FORMAT_BC1_UNORM_SRGB:
case DXGI_FORMAT_BC4_TYPELESS:
case DXGI_FORMAT_BC4_UNORM:
case DXGI_FORMAT_BC4_SNORM:
return 4;

case DXGI_FORMAT_BC2_TYPELESS:
case DXGI_FORMAT_BC2_UNORM:
case DXGI_FORMAT_BC2_UNORM_SRGB:
case DXGI_FORMAT_BC3_TYPELESS:
case DXGI_FORMAT_BC3_UNORM:
case DXGI_FORMAT_BC3_UNORM_SRGB:
case DXGI_FORMAT_BC5_TYPELESS:
case DXGI_FORMAT_BC5_UNORM:
case DXGI_FORMAT_BC5_SNORM:
case DXGI_FORMAT_BC6H_TYPELESS:
case DXGI_FORMAT_BC6H_UF16:
case DXGI_FORMAT_BC6H_SF16:
case DXGI_FORMAT_BC7_TYPELESS:
case DXGI_FORMAT_BC7_UNORM:
case DXGI_FORMAT_BC7_UNORM_SRGB:
return 8;

default:
BLK_ASSERT(0);
return 0;
}
}

void Texture1D::Unload()
{
BLK_ASSERT(m_Resource);

m_Resource->Release();
m_Resource = nullptr;
}

D3D12_RESOURCE_DESC Texture1D::FillDesc(UINT64 width, UINT16 mipCount, DXGI_FORMAT format,
D3D12_RESOURCE_FLAGS resourceFlags, UINT16 arraySize)
{
D3D12_RESOURCE_DESC resourceDesc = {};
resourceDesc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE1D;
resourceDesc.Alignment = 0;
resourceDesc.Width = width;
resourceDesc.Height = 1;
resourceDesc.DepthOrArraySize = arraySize;
resourceDesc.MipLevels = mipCount;
resourceDesc.Format = format;
resourceDesc.SampleDesc.Count = 1;
resourceDesc.SampleDesc.Quality = 0;
resourceDesc.Layout = D3D12_TEXTURE_LAYOUT_UNKNOWN;
resourceDesc.Flags = resourceFlags;

return resourceDesc;
}

} // namespace Boolka
45 changes: 45 additions & 0 deletions D3D12Backend/APIWrappers/Resources/Textures/Texture1D.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
#pragma once
#include "Texture.h"

namespace Boolka
{

class Device;
class ResourceHeap;

class [[nodiscard]] Texture1D : public Texture
{
public:
Texture1D() = default;
~Texture1D() = default;

// Creates committed resource
bool Initialize(Device& device, D3D12_HEAP_TYPE heapType, UINT64 width, UINT16 mipCount,
DXGI_FORMAT format, D3D12_RESOURCE_FLAGS resourceFlags,
D3D12_CLEAR_VALUE* clearValue, D3D12_RESOURCE_STATES initialState,
UINT16 arraySize = 1);
// Creates placed resource
bool Initialize(Device& device, ResourceHeap& resourceHeap, size_t heapOffset, UINT64 width,
UINT16 mipCount, DXGI_FORMAT format, D3D12_RESOURCE_FLAGS resourceFlags,
D3D12_CLEAR_VALUE* clearValue, D3D12_RESOURCE_STATES initialState,
UINT16 arraySize = 1);
static void GetRequiredSize(size_t& outAlignment, size_t& outSize, Device& device,
UINT64 width, UINT16 mipCount, DXGI_FORMAT format,
D3D12_RESOURCE_FLAGS resourceFlags, UINT16 arraySize = 1);
[[nodiscard]] static size_t GetUploadSize(UINT width, UINT16 mipCount,
DXGI_FORMAT format,
D3D12_RESOURCE_FLAGS resourceFlags,
UINT16 arraySize = 1);
[[nodiscard]] static UINT GetBPP(DXGI_FORMAT format);

// This method don't increment resource's reference count
// You should do it yourself if needed
bool Initialize(ID3D12Resource* resource);
void Unload();

private:
static D3D12_RESOURCE_DESC FillDesc(UINT64 width, UINT16 mipCount, DXGI_FORMAT format,
D3D12_RESOURCE_FLAGS resourceFlags, UINT16 arraySize);
};

} // namespace Boolka
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,30 @@
namespace Boolka
{

void ShaderResourceView::Initialize(Device& device, Texture1D& texture,
D3D12_CPU_DESCRIPTOR_HANDLE destDescriptor)
{
device->CreateShaderResourceView(texture.Get(), nullptr, destDescriptor);
}

void ShaderResourceView::Initialize(Device& device, Texture2D& texture,
D3D12_CPU_DESCRIPTOR_HANDLE destDescriptor)
{
device->CreateShaderResourceView(texture.Get(), nullptr, destDescriptor);
}

void ShaderResourceView::Initialize(Device& device, Texture1D& texture,
D3D12_CPU_DESCRIPTOR_HANDLE destDescriptor,
DXGI_FORMAT format)
{
D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc{};
srvDesc.Format = format;
srvDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;
srvDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE1D;
srvDesc.Texture2D.MipLevels = -1;
device->CreateShaderResourceView(texture.Get(), &srvDesc, destDescriptor);
}

void ShaderResourceView::Initialize(Device& device, Texture2D& texture,
D3D12_CPU_DESCRIPTOR_HANDLE destDescriptor,
DXGI_FORMAT format)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,12 @@ namespace Boolka
class ShaderResourceView
{
public:
static void Initialize(Device& device, Texture1D& texture,
D3D12_CPU_DESCRIPTOR_HANDLE destDescriptor);
static void Initialize(Device& device, Texture2D& texture,
D3D12_CPU_DESCRIPTOR_HANDLE destDescriptor);
static void Initialize(Device& device, Texture1D& texture,
D3D12_CPU_DESCRIPTOR_HANDLE destDescriptor, DXGI_FORMAT format);
static void Initialize(Device& device, Texture2D& texture,
D3D12_CPU_DESCRIPTOR_HANDLE destDescriptor, DXGI_FORMAT format);
static void Initialize(Device& device, Buffer& buffer, UINT elementCount, UINT stride,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,16 @@
namespace Boolka
{

void UnorderedAccessView::Initialize(Device& device, Texture1D& texture, DXGI_FORMAT format,
D3D12_CPU_DESCRIPTOR_HANDLE destDescriptor)
{
D3D12_UNORDERED_ACCESS_VIEW_DESC desc{};
desc.Format = format;
desc.ViewDimension = D3D12_UAV_DIMENSION_TEXTURE1D;

device->CreateUnorderedAccessView(texture.Get(), nullptr, &desc, destDescriptor);
}

void UnorderedAccessView::Initialize(Device& device, Texture2D& texture, DXGI_FORMAT format,
D3D12_CPU_DESCRIPTOR_HANDLE destDescriptor)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ namespace Boolka
class UnorderedAccessView
{
public:
static void Initialize(Device& device, Texture1D& texture, DXGI_FORMAT format,
D3D12_CPU_DESCRIPTOR_HANDLE destDescriptor);
static void Initialize(Device& device, Texture2D& texture, DXGI_FORMAT format,
D3D12_CPU_DESCRIPTOR_HANDLE destDescriptor);
static void Initialize(Device& device, Buffer& buffer, UINT stride, UINT elementCount,
Expand Down
Loading

0 comments on commit 469bb1d

Please sign in to comment.