DirectXTK12/Src/CommonStates.cpp

530 строки
17 KiB
C++

//--------------------------------------------------------------------------------------
// File: CommonStates.cpp
//
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// http://go.microsoft.com/fwlink/?LinkID=615561
//--------------------------------------------------------------------------------------
#include "pch.h"
#include "CommonStates.h"
#include "DirectXHelpers.h"
#include "DescriptorHeap.h"
using namespace DirectX;
// --------------------------------------------------------------------------
// Blend States
// --------------------------------------------------------------------------
const D3D12_BLEND_DESC CommonStates::Opaque =
{
FALSE, // AlphaToCoverageEnable
FALSE, // IndependentBlendEnable
{
FALSE, // BlendEnable
FALSE, // LogicOpEnable
D3D12_BLEND_ONE, // SrcBlend
D3D12_BLEND_ZERO, // DestBlend
D3D12_BLEND_OP_ADD, // BlendOp
D3D12_BLEND_ONE, // SrcBlendAlpha
D3D12_BLEND_ZERO, // DestBlendAlpha
D3D12_BLEND_OP_ADD, // BlendOpAlpha
D3D12_LOGIC_OP_NOOP,
D3D12_COLOR_WRITE_ENABLE_ALL
}
};
const D3D12_BLEND_DESC CommonStates::AlphaBlend =
{
FALSE, // AlphaToCoverageEnable
FALSE, // IndependentBlendEnable
{
TRUE, // BlendEnable
FALSE, // LogicOpEnable
D3D12_BLEND_ONE, // SrcBlend
D3D12_BLEND_INV_SRC_ALPHA, // DestBlend
D3D12_BLEND_OP_ADD, // BlendOp
D3D12_BLEND_ONE, // SrcBlendAlpha
D3D12_BLEND_INV_SRC_ALPHA, // DestBlendAlpha
D3D12_BLEND_OP_ADD, // BlendOpAlpha
D3D12_LOGIC_OP_NOOP,
D3D12_COLOR_WRITE_ENABLE_ALL
}
};
const D3D12_BLEND_DESC CommonStates::Additive =
{
FALSE, // AlphaToCoverageEnable
FALSE, // IndependentBlendEnable
{
TRUE, // BlendEnable
FALSE, // LogicOpEnable
D3D12_BLEND_SRC_ALPHA, // SrcBlend
D3D12_BLEND_ONE, // DestBlend
D3D12_BLEND_OP_ADD, // BlendOp
D3D12_BLEND_SRC_ALPHA, // SrcBlendAlpha
D3D12_BLEND_ONE, // DestBlendAlpha
D3D12_BLEND_OP_ADD, // BlendOpAlpha
D3D12_LOGIC_OP_NOOP,
D3D12_COLOR_WRITE_ENABLE_ALL
}
};
const D3D12_BLEND_DESC CommonStates::NonPremultiplied =
{
FALSE, // AlphaToCoverageEnable
FALSE, // IndependentBlendEnable
{
TRUE, // BlendEnable
FALSE, // LogicOpEnable
D3D12_BLEND_SRC_ALPHA, // SrcBlend
D3D12_BLEND_INV_SRC_ALPHA, // DestBlend
D3D12_BLEND_OP_ADD, // BlendOp
D3D12_BLEND_SRC_ALPHA, // SrcBlendAlpha
D3D12_BLEND_INV_SRC_ALPHA, // DestBlendAlpha
D3D12_BLEND_OP_ADD, // BlendOpAlpha
D3D12_LOGIC_OP_NOOP,
D3D12_COLOR_WRITE_ENABLE_ALL
}
};
// --------------------------------------------------------------------------
// Depth-Stencil States
// --------------------------------------------------------------------------
const D3D12_DEPTH_STENCIL_DESC CommonStates::DepthNone =
{
FALSE, // DepthEnable
D3D12_DEPTH_WRITE_MASK_ZERO,
D3D12_COMPARISON_FUNC_LESS_EQUAL, // DepthFunc
FALSE, // StencilEnable
D3D12_DEFAULT_STENCIL_READ_MASK,
D3D12_DEFAULT_STENCIL_WRITE_MASK,
{
D3D12_STENCIL_OP_KEEP, // StencilFailOp
D3D12_STENCIL_OP_KEEP, // StencilDepthFailOp
D3D12_STENCIL_OP_KEEP, // StencilPassOp
D3D12_COMPARISON_FUNC_ALWAYS // StencilFunc
}, // FrontFace
{
D3D12_STENCIL_OP_KEEP, // StencilFailOp
D3D12_STENCIL_OP_KEEP, // StencilDepthFailOp
D3D12_STENCIL_OP_KEEP, // StencilPassOp
D3D12_COMPARISON_FUNC_ALWAYS // StencilFunc
} // BackFace
};
const D3D12_DEPTH_STENCIL_DESC CommonStates::DepthDefault =
{
TRUE, // DepthEnable
D3D12_DEPTH_WRITE_MASK_ALL,
D3D12_COMPARISON_FUNC_LESS_EQUAL, // DepthFunc
FALSE, // StencilEnable
D3D12_DEFAULT_STENCIL_READ_MASK,
D3D12_DEFAULT_STENCIL_WRITE_MASK,
{
D3D12_STENCIL_OP_KEEP, // StencilFailOp
D3D12_STENCIL_OP_KEEP, // StencilDepthFailOp
D3D12_STENCIL_OP_KEEP, // StencilPassOp
D3D12_COMPARISON_FUNC_ALWAYS // StencilFunc
}, // FrontFace
{
D3D12_STENCIL_OP_KEEP, // StencilFailOp
D3D12_STENCIL_OP_KEEP, // StencilDepthFailOp
D3D12_STENCIL_OP_KEEP, // StencilPassOp
D3D12_COMPARISON_FUNC_ALWAYS // StencilFunc
} // BackFace
};
const D3D12_DEPTH_STENCIL_DESC CommonStates::DepthRead =
{
TRUE, // DepthEnable
D3D12_DEPTH_WRITE_MASK_ZERO,
D3D12_COMPARISON_FUNC_LESS_EQUAL, // DepthFunc
FALSE, // StencilEnable
D3D12_DEFAULT_STENCIL_READ_MASK,
D3D12_DEFAULT_STENCIL_WRITE_MASK,
{
D3D12_STENCIL_OP_KEEP, // StencilFailOp
D3D12_STENCIL_OP_KEEP, // StencilDepthFailOp
D3D12_STENCIL_OP_KEEP, // StencilPassOp
D3D12_COMPARISON_FUNC_ALWAYS // StencilFunc
}, // FrontFace
{
D3D12_STENCIL_OP_KEEP, // StencilFailOp
D3D12_STENCIL_OP_KEEP, // StencilDepthFailOp
D3D12_STENCIL_OP_KEEP, // StencilPassOp
D3D12_COMPARISON_FUNC_ALWAYS // StencilFunc
} // BackFace
};
// --------------------------------------------------------------------------
// Rasterizer States
// --------------------------------------------------------------------------
const D3D12_RASTERIZER_DESC CommonStates::CullNone =
{
D3D12_FILL_MODE_SOLID,
D3D12_CULL_MODE_NONE,
FALSE, // FrontCounterClockwise
D3D12_DEFAULT_DEPTH_BIAS,
D3D12_DEFAULT_DEPTH_BIAS_CLAMP,
D3D12_DEFAULT_SLOPE_SCALED_DEPTH_BIAS,
TRUE, // DepthClipEnable
TRUE, // MultisampleEnable
FALSE, // AntialiasedLineEnable
0, // ForcedSampleCount
D3D12_CONSERVATIVE_RASTERIZATION_MODE_OFF
};
const D3D12_RASTERIZER_DESC CommonStates::CullClockwise =
{
D3D12_FILL_MODE_SOLID,
D3D12_CULL_MODE_FRONT,
FALSE, // FrontCounterClockwise
D3D12_DEFAULT_DEPTH_BIAS,
D3D12_DEFAULT_DEPTH_BIAS_CLAMP,
D3D12_DEFAULT_SLOPE_SCALED_DEPTH_BIAS,
TRUE, // DepthClipEnable
TRUE, // MultisampleEnable
FALSE, // AntialiasedLineEnable
0, // ForcedSampleCount
D3D12_CONSERVATIVE_RASTERIZATION_MODE_OFF
};
const D3D12_RASTERIZER_DESC CommonStates::CullCounterClockwise =
{
D3D12_FILL_MODE_SOLID,
D3D12_CULL_MODE_BACK,
FALSE, // FrontCounterClockwise
D3D12_DEFAULT_DEPTH_BIAS,
D3D12_DEFAULT_DEPTH_BIAS_CLAMP,
D3D12_DEFAULT_SLOPE_SCALED_DEPTH_BIAS,
TRUE, // DepthClipEnable
TRUE, // MultisampleEnable
FALSE, // AntialiasedLineEnable
0, // ForcedSampleCount
D3D12_CONSERVATIVE_RASTERIZATION_MODE_OFF
};
const D3D12_RASTERIZER_DESC CommonStates::Wireframe =
{
D3D12_FILL_MODE_WIREFRAME,
D3D12_CULL_MODE_NONE,
FALSE, // FrontCounterClockwise
D3D12_DEFAULT_DEPTH_BIAS,
D3D12_DEFAULT_DEPTH_BIAS_CLAMP,
D3D12_DEFAULT_SLOPE_SCALED_DEPTH_BIAS,
TRUE, // DepthClipEnable
TRUE, // MultisampleEnable
FALSE, // AntialiasedLineEnable
0, // ForcedSampleCount
D3D12_CONSERVATIVE_RASTERIZATION_MODE_OFF
};
// --------------------------------------------------------------------------
// Static sampler States
// --------------------------------------------------------------------------
const D3D12_STATIC_SAMPLER_DESC CommonStates::StaticPointWrap(unsigned int shaderRegister, D3D12_SHADER_VISIBILITY shaderVisibility, unsigned int registerSpace)
{
static const D3D12_STATIC_SAMPLER_DESC s_desc = {
D3D12_FILTER_MIN_MAG_MIP_POINT,
D3D12_TEXTURE_ADDRESS_MODE_WRAP, // AddressU
D3D12_TEXTURE_ADDRESS_MODE_WRAP, // AddressV
D3D12_TEXTURE_ADDRESS_MODE_WRAP, // AddressW
0, // MipLODBias
D3D12_MAX_MAXANISOTROPY,
D3D12_COMPARISON_FUNC_NEVER,
D3D12_STATIC_BORDER_COLOR_OPAQUE_BLACK,
0, // MinLOD
FLT_MAX, // MaxLOD
0, // ShaderRegister
0, // RegisterSpace
D3D12_SHADER_VISIBILITY_ALL,
};
D3D12_STATIC_SAMPLER_DESC desc = s_desc;
desc.ShaderRegister = shaderRegister;
desc.ShaderVisibility = shaderVisibility;
desc.RegisterSpace = registerSpace;
return desc;
}
const D3D12_STATIC_SAMPLER_DESC CommonStates::StaticPointClamp(unsigned int shaderRegister, D3D12_SHADER_VISIBILITY shaderVisibility, unsigned int registerSpace)
{
static const D3D12_STATIC_SAMPLER_DESC s_desc = {
D3D12_FILTER_MIN_MAG_MIP_POINT,
D3D12_TEXTURE_ADDRESS_MODE_CLAMP, // AddressU
D3D12_TEXTURE_ADDRESS_MODE_CLAMP, // AddressV
D3D12_TEXTURE_ADDRESS_MODE_CLAMP, // AddressW
0, // MipLODBias
D3D12_MAX_MAXANISOTROPY,
D3D12_COMPARISON_FUNC_NEVER,
D3D12_STATIC_BORDER_COLOR_OPAQUE_BLACK,
0, // MinLOD
FLT_MAX, // MaxLOD
0, // ShaderRegister
0, // RegisterSpace
D3D12_SHADER_VISIBILITY_ALL,
};
D3D12_STATIC_SAMPLER_DESC desc = s_desc;
desc.ShaderRegister = shaderRegister;
desc.ShaderVisibility = shaderVisibility;
desc.RegisterSpace = registerSpace;
return desc;
};
const D3D12_STATIC_SAMPLER_DESC CommonStates::StaticLinearWrap(unsigned int shaderRegister, D3D12_SHADER_VISIBILITY shaderVisibility, unsigned int registerSpace)
{
static const D3D12_STATIC_SAMPLER_DESC s_desc = {
D3D12_FILTER_MIN_MAG_MIP_LINEAR,
D3D12_TEXTURE_ADDRESS_MODE_WRAP, // AddressU
D3D12_TEXTURE_ADDRESS_MODE_WRAP, // AddressV
D3D12_TEXTURE_ADDRESS_MODE_WRAP, // AddressW
0, // MipLODBias
D3D12_MAX_MAXANISOTROPY,
D3D12_COMPARISON_FUNC_NEVER,
D3D12_STATIC_BORDER_COLOR_OPAQUE_BLACK,
0, // MinLOD
FLT_MAX, // MaxLOD
0, // ShaderRegister
0, // RegisterSpace
D3D12_SHADER_VISIBILITY_ALL,
};
D3D12_STATIC_SAMPLER_DESC desc = s_desc;
desc.ShaderRegister = shaderRegister;
desc.ShaderVisibility = shaderVisibility;
desc.RegisterSpace = registerSpace;
return desc;
};
const D3D12_STATIC_SAMPLER_DESC CommonStates::StaticLinearClamp(unsigned int shaderRegister, D3D12_SHADER_VISIBILITY shaderVisibility, unsigned int registerSpace)
{
static const D3D12_STATIC_SAMPLER_DESC s_desc = {
D3D12_FILTER_MIN_MAG_MIP_LINEAR,
D3D12_TEXTURE_ADDRESS_MODE_CLAMP, // AddressU
D3D12_TEXTURE_ADDRESS_MODE_CLAMP, // AddressV
D3D12_TEXTURE_ADDRESS_MODE_CLAMP, // AddressW
0, // MipLODBias
D3D12_MAX_MAXANISOTROPY,
D3D12_COMPARISON_FUNC_NEVER,
D3D12_STATIC_BORDER_COLOR_OPAQUE_BLACK,
0, // MinLOD
FLT_MAX, // MaxLOD
0, // ShaderRegister
0, // RegisterSpace
D3D12_SHADER_VISIBILITY_ALL,
};
D3D12_STATIC_SAMPLER_DESC desc = s_desc;
desc.ShaderRegister = shaderRegister;
desc.ShaderVisibility = shaderVisibility;
desc.RegisterSpace = registerSpace;
return desc;
};
const D3D12_STATIC_SAMPLER_DESC CommonStates::StaticAnisotropicWrap(unsigned int shaderRegister, D3D12_SHADER_VISIBILITY shaderVisibility, unsigned int registerSpace)
{
static const D3D12_STATIC_SAMPLER_DESC s_desc = {
D3D12_FILTER_ANISOTROPIC,
D3D12_TEXTURE_ADDRESS_MODE_WRAP, // AddressU
D3D12_TEXTURE_ADDRESS_MODE_WRAP, // AddressV
D3D12_TEXTURE_ADDRESS_MODE_WRAP, // AddressW
0, // MipLODBias
D3D12_MAX_MAXANISOTROPY,
D3D12_COMPARISON_FUNC_NEVER,
D3D12_STATIC_BORDER_COLOR_OPAQUE_BLACK,
0, // MinLOD
FLT_MAX, // MaxLOD
0, // ShaderRegister
0, // RegisterSpace
D3D12_SHADER_VISIBILITY_ALL,
};
D3D12_STATIC_SAMPLER_DESC desc = s_desc;
desc.ShaderRegister = shaderRegister;
desc.ShaderVisibility = shaderVisibility;
desc.RegisterSpace = registerSpace;
return desc;
};
const D3D12_STATIC_SAMPLER_DESC CommonStates::StaticAnisotropicClamp(unsigned int shaderRegister, D3D12_SHADER_VISIBILITY shaderVisibility, unsigned int registerSpace)
{
static const D3D12_STATIC_SAMPLER_DESC s_desc = {
D3D12_FILTER_ANISOTROPIC,
D3D12_TEXTURE_ADDRESS_MODE_CLAMP, // AddressU
D3D12_TEXTURE_ADDRESS_MODE_CLAMP, // AddressV
D3D12_TEXTURE_ADDRESS_MODE_CLAMP, // AddressW
0, // MipLODBias
D3D12_MAX_MAXANISOTROPY,
D3D12_COMPARISON_FUNC_NEVER,
D3D12_STATIC_BORDER_COLOR_OPAQUE_BLACK,
0, // MinLOD
FLT_MAX, // MaxLOD
0, // ShaderRegister
0, // RegisterSpace
D3D12_SHADER_VISIBILITY_ALL,
};
D3D12_STATIC_SAMPLER_DESC desc = s_desc;
desc.ShaderRegister = shaderRegister;
desc.ShaderVisibility = shaderVisibility;
desc.RegisterSpace = registerSpace;
return desc;
};
// --------------------------------------------------------------------------
// Samplers
// --------------------------------------------------------------------------
class CommonStates::Impl
{
public:
static const D3D12_SAMPLER_DESC SamplerDescs[static_cast<int>(SamplerIndex::Count)];
Impl(_In_ ID3D12Device* device)
: mDescriptors(device, D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER, D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE, (int) SamplerIndex::Count)
{
for (int i = 0; i < static_cast<int>(SamplerIndex::Count); ++i)
{
device->CreateSampler(&SamplerDescs[i], mDescriptors.GetCpuHandle(i));
}
}
D3D12_GPU_DESCRIPTOR_HANDLE Get(SamplerIndex i) const
{
return mDescriptors.GetGpuHandle((int) i);
}
ID3D12DescriptorHeap* Heap() const
{
return mDescriptors.Heap();
}
private:
DescriptorHeap mDescriptors;
};
const D3D12_SAMPLER_DESC CommonStates::Impl::SamplerDescs[] =
{
// PointWrap
{
D3D12_FILTER_MIN_MAG_MIP_POINT,
D3D12_TEXTURE_ADDRESS_MODE_WRAP, // AddressU
D3D12_TEXTURE_ADDRESS_MODE_WRAP, // AddressV
D3D12_TEXTURE_ADDRESS_MODE_WRAP, // AddressW
0, // MipLODBias
D3D12_MAX_MAXANISOTROPY,
D3D12_COMPARISON_FUNC_NEVER,
{ 0, 0, 0, 0 }, // BorderColor
0, // MinLOD
FLT_MAX // MaxLOD
},
// PointClamp
{
D3D12_FILTER_MIN_MAG_MIP_POINT,
D3D12_TEXTURE_ADDRESS_MODE_CLAMP, // AddressU
D3D12_TEXTURE_ADDRESS_MODE_CLAMP, // AddressV
D3D12_TEXTURE_ADDRESS_MODE_CLAMP, // AddressW
0, // MipLODBias
D3D12_MAX_MAXANISOTROPY,
D3D12_COMPARISON_FUNC_NEVER,
{ 0, 0, 0, 0 }, // BorderColor
0, // MinLOD
FLT_MAX // MaxLOD
},
// LinearWrap
{
D3D12_FILTER_MIN_MAG_MIP_LINEAR,
D3D12_TEXTURE_ADDRESS_MODE_WRAP, // AddressU
D3D12_TEXTURE_ADDRESS_MODE_WRAP, // AddressV
D3D12_TEXTURE_ADDRESS_MODE_WRAP, // AddressW
0, // MipLODBias
D3D12_MAX_MAXANISOTROPY,
D3D12_COMPARISON_FUNC_NEVER,
{ 0, 0, 0, 0 }, // BorderColor
0, // MinLOD
FLT_MAX // MaxLOD
},
// LinearClamp
{
D3D12_FILTER_MIN_MAG_MIP_LINEAR,
D3D12_TEXTURE_ADDRESS_MODE_CLAMP, // AddressU
D3D12_TEXTURE_ADDRESS_MODE_CLAMP, // AddressV
D3D12_TEXTURE_ADDRESS_MODE_CLAMP, // AddressW
0, // MipLODBias
D3D12_MAX_MAXANISOTROPY,
D3D12_COMPARISON_FUNC_NEVER,
{ 0, 0, 0, 0 }, // BorderColor
0, // MinLOD
FLT_MAX // MaxLOD
},
// AnisotropicWrap
{
D3D12_FILTER_ANISOTROPIC,
D3D12_TEXTURE_ADDRESS_MODE_WRAP, // AddressU
D3D12_TEXTURE_ADDRESS_MODE_WRAP, // AddressV
D3D12_TEXTURE_ADDRESS_MODE_WRAP, // AddressW
0, // MipLODBias
D3D12_MAX_MAXANISOTROPY,
D3D12_COMPARISON_FUNC_NEVER,
{ 0, 0, 0, 0 }, // BorderColor
0, // MinLOD
FLT_MAX // MaxLOD
},
// AnisotropicClamp
{
D3D12_FILTER_ANISOTROPIC,
D3D12_TEXTURE_ADDRESS_MODE_CLAMP, // AddressU
D3D12_TEXTURE_ADDRESS_MODE_CLAMP, // AddressV
D3D12_TEXTURE_ADDRESS_MODE_CLAMP, // AddressW
0, // MipLODBias
D3D12_MAX_MAXANISOTROPY,
D3D12_COMPARISON_FUNC_NEVER,
{ 0, 0, 0, 0 }, // BorderColor
0, // MinLOD
FLT_MAX // MaxLOD
}
};
_Use_decl_annotations_
CommonStates::CommonStates(ID3D12Device* device)
{
pImpl = std::make_unique<Impl>(device);
}
CommonStates::CommonStates(CommonStates&& moveFrom)
: pImpl(std::move(moveFrom.pImpl))
{
}
CommonStates::~CommonStates() {}
CommonStates& CommonStates::operator = (CommonStates&& moveFrom)
{
pImpl = std::move(moveFrom.pImpl);
return *this;
}
D3D12_GPU_DESCRIPTOR_HANDLE CommonStates::PointWrap() const { return pImpl->Get(SamplerIndex::PointWrap); }
D3D12_GPU_DESCRIPTOR_HANDLE CommonStates::PointClamp() const { return pImpl->Get(SamplerIndex::PointClamp); }
D3D12_GPU_DESCRIPTOR_HANDLE CommonStates::LinearWrap() const { return pImpl->Get(SamplerIndex::LinearWrap); }
D3D12_GPU_DESCRIPTOR_HANDLE CommonStates::LinearClamp() const { return pImpl->Get(SamplerIndex::LinearClamp); }
D3D12_GPU_DESCRIPTOR_HANDLE CommonStates::AnisotropicWrap() const { return pImpl->Get(SamplerIndex::AnisotropicWrap); }
D3D12_GPU_DESCRIPTOR_HANDLE CommonStates::AnisotropicClamp() const { return pImpl->Get(SamplerIndex::AnisotropicClamp); }
ID3D12DescriptorHeap* CommonStates::Heap() const { return pImpl->Heap(); }