Added support for feature: Rasterizer Ordered Views

This commit is contained in:
turanszkij
2017-03-02 15:23:06 +01:00
parent 2651caa98f
commit 86554a2ba5
10 changed files with 146 additions and 99 deletions
+16 -27
View File
@@ -80,37 +80,26 @@
// Automatically binds resources on the shader side:
#define STRUCTUREDBUFFER_X(name, type, slot) StructuredBuffer< type > name : register(t ## slot)
#define STRUCTUREDBUFFER(name, type, slot) STRUCTUREDBUFFER_X(name, type, slot)
#define RWSTRUCTUREDBUFFER_X(name, type, slot) RWStructuredBuffer< type > name : register(u ## slot)
#define RWSTRUCTUREDBUFFER(name, type, slot) RWSTRUCTUREDBUFFER_X(name, type, slot)
#define STRUCTUREDBUFFER(name, type, slot) StructuredBuffer< type > name : register(t ## slot)
#define RWSTRUCTUREDBUFFER(name, type, slot) RWStructuredBuffer< type > name : register(u ## slot)
#define ROVSTRUCTUREDBUFFER(name, type, slot) RasterizerOrderedStructuredBuffer< type > name : register(u ## slot)
#define TEXTURE1D_X(name, type, slot) Texture1D< type > name : register(t ## slot);
#define TEXTURE1D(name, type, slot) TEXTURE1D_X(name, type, slot)
#define TEXTURE1DARRAY_X(name, type, slot) Texture1DArray< type > name : register(t ## slot);
#define TEXTURE1DARRAY(name, type, slot) TEXTURE1DARRAY_X(name, type, slot)
#define RWTEXTURE1D_X(name, type, slot) RWTexture1D< type > name : register(u ## slot);
#define RWTEXTURE1D(name, type, slot) RWTEXTURE1D_X(name, type, slot)
#define TEXTURE1D(name, type, slot) Texture1D< type > name : register(t ## slot);
#define TEXTURE1DARRAY(name, type, slot) Texture1DArray< type > name : register(t ## slot);
#define RWTEXTURE1D(name, type, slot) RWTexture1D< type > name : register(u ## slot);
#define TEXTURE2D_X(name, type, slot) Texture2D< type > name : register(t ## slot);
#define TEXTURE2D(name, type, slot) TEXTURE2D_X(name, type, slot)
#define TEXTURE2DMS_X(name, type, slot) Texture2DMS< type > name : register(t ## slot);
#define TEXTURE2DMS(name, type, slot) TEXTURE2DMS_X(name, type, slot)
#define TEXTURE2DARRAY_X(name, type, slot) Texture2DArray< type > name : register(t ## slot);
#define TEXTURE2DARRAY(name, type, slot) TEXTURE2DARRAY_X(name, type, slot)
#define RWTEXTURE2D_X(name, type, slot) RWTexture2D< type > name : register(u ## slot);
#define RWTEXTURE2D(name, type, slot) RWTEXTURE2D_X(name, type, slot)
#define TEXTURE2D(name, type, slot) Texture2D< type > name : register(t ## slot);
#define TEXTURE2DMS(name, type, slot) Texture2DMS< type > name : register(t ## slot);
#define TEXTURE2DARRAY(name, type, slot) Texture2DArray< type > name : register(t ## slot);
#define RWTEXTURE2D(name, type, slot) RWTexture2D< type > name : register(u ## slot);
#define ROVTEXTURE2D(name, type, slot) RasterizerOrderedTexture2D< type > name : register(u ## slot);
#define TEXTURECUBE_X(name, type, slot) TextureCube< type > name : register(t ## slot);
#define TEXTURECUBE(name, type, slot) TEXTURECUBE_X(name, type, slot)
#define TEXTURECUBEARRAY_X(name, type, slot) TextureCubeArray< type > name : register(t ## slot);
#define TEXTURECUBEARRAY(name, type, slot) TEXTURECUBEARRAY_X(name, type, slot)
#define TEXTURE3D_X(name, type, slot) Texture3D< type > name : register(t ## slot);
#define TEXTURE3D(name, type, slot) TEXTURE3D_X(name, type, slot)
#define RWTEXTURE3D_X(name, type, slot) RWTexture3D< type > name : register(u ## slot);
#define RWTEXTURE3D(name, type, slot) RWTEXTURE3D_X(name, type, slot)
#define TEXTURECUBE(name, type, slot) TextureCube< type > name : register(t ## slot);
#define TEXTURECUBEARRAY(name, type, slot) TextureCubeArray< type > name : register(t ## slot);
#define TEXTURE3D(name, type, slot) Texture3D< type > name : register(t ## slot);
#define RWTEXTURE3D(name, type, slot) RWTexture3D< type > name : register(u ## slot);
#define ROVTEXTURE3D(name, type, slot) RasterizerOrderedTexture3D< type > name : register(u ## slot);
#endif // _RESOURCEBUFFER_MAPPING_H_
+2 -2
View File
@@ -1,7 +1,7 @@
#include "objectHF.hlsli"
RWTEXTURE3D(output_emission, float4, 0);
RWTEXTURE3D(output_normal, float4, 1);
ROVTEXTURE3D(output_emission, float4, 0);
ROVTEXTURE3D(output_normal, float4, 1);
void main(float4 pos : SV_POSITION, float3 N : NORMAL, float2 tex : TEXCOORD, float3 P : POSITION3D)
{
+53 -26
View File
@@ -277,10 +277,10 @@ namespace wiGraphicsTypes
};
enum GPU_QUERY_TYPE
{
GPU_QUERY_TYPE_OCCLUSION, // how many samples passed depthstencil test?
GPU_QUERY_TYPE_OCCLUSION, // how many samples passed depthstencil test?
GPU_QUERY_TYPE_OCCLUSION_PREDICATE, // are there any samples that passed depthstencil test
GPU_QUERY_TYPE_TIMESTAMP,
GPU_QUERY_TYPE_TIMESTAMP_DISJOINT,
GPU_QUERY_TYPE_TIMESTAMP, // retrieve time point of gpu execution
GPU_QUERY_TYPE_TIMESTAMP_DISJOINT, // timestamp frequency information
};
// Flags ////////////////////////////////////////////
@@ -324,12 +324,22 @@ namespace wiGraphicsTypes
struct ViewPort
{
FLOAT TopLeftX;
FLOAT TopLeftY;
FLOAT Width;
FLOAT Height;
FLOAT MinDepth;
FLOAT MaxDepth;
float TopLeftX;
float TopLeftY;
float Width;
float Height;
float MinDepth;
float MaxDepth;
ViewPort():
TopLeftX(0.0f),
TopLeftY(0.0f),
Width(0.0f),
Height(0.0f),
MinDepth(0.0f),
MaxDepth(1.0f)
{
}
};
struct VertexLayoutDesc
{
@@ -397,26 +407,43 @@ namespace wiGraphicsTypes
TEXTURE_ADDRESS_MODE AddressU;
TEXTURE_ADDRESS_MODE AddressV;
TEXTURE_ADDRESS_MODE AddressW;
FLOAT MipLODBias;
float MipLODBias;
UINT MaxAnisotropy;
COMPARISON_FUNC ComparisonFunc;
FLOAT BorderColor[4];
FLOAT MinLOD;
FLOAT MaxLOD;
float BorderColor[4];
float MinLOD;
float MaxLOD;
};
struct RasterizerStateDesc
{
FILL_MODE FillMode;
CULL_MODE CullMode;
BOOL FrontCounterClockwise;
bool FrontCounterClockwise;
INT DepthBias;
FLOAT DepthBiasClamp;
FLOAT SlopeScaledDepthBias;
BOOL DepthClipEnable;
BOOL ScissorEnable;
BOOL MultisampleEnable;
BOOL AntialiasedLineEnable;
BOOL ConservativeRasterizationEnable;
float DepthBiasClamp;
float SlopeScaledDepthBias;
bool DepthClipEnable;
bool ScissorEnable;
bool MultisampleEnable;
bool AntialiasedLineEnable;
bool ConservativeRasterizationEnable;
UINT ForcedSampleCount;
RasterizerStateDesc() :
FillMode( FILL_SOLID ),
CullMode( CULL_NONE ),
FrontCounterClockwise( false ),
DepthBias( 0 ),
DepthBiasClamp( 0.0f ),
SlopeScaledDepthBias( 0.0f ),
DepthClipEnable( false ),
ScissorEnable( false ),
MultisampleEnable( false ),
AntialiasedLineEnable( false ),
ConservativeRasterizationEnable( false ),
ForcedSampleCount( 0 )
{
}
};
struct DepthStencilOpDesc
{
@@ -427,10 +454,10 @@ namespace wiGraphicsTypes
};
struct DepthStencilStateDesc
{
BOOL DepthEnable;
bool DepthEnable;
DEPTH_WRITE_MASK DepthWriteMask;
COMPARISON_FUNC DepthFunc;
BOOL StencilEnable;
bool StencilEnable;
UINT8 StencilReadMask;
UINT8 StencilWriteMask;
DepthStencilOpDesc FrontFace;
@@ -438,7 +465,7 @@ namespace wiGraphicsTypes
};
struct RenderTargetBlendStateDesc
{
BOOL BlendEnable;
bool BlendEnable;
BLEND SrcBlend;
BLEND DestBlend;
BLEND_OP BlendOp;
@@ -449,8 +476,8 @@ namespace wiGraphicsTypes
};
struct BlendStateDesc
{
BOOL AlphaToCoverageEnable;
BOOL IndependentBlendEnable;
bool AlphaToCoverageEnable;
bool IndependentBlendEnable;
RenderTargetBlendStateDesc RenderTarget[8];
};
struct GPUBufferDesc
+1
View File
@@ -67,6 +67,7 @@ namespace wiGraphicsTypes
GRAPHICSDEVICE_CAPABILITY_TESSELLATION,
GRAPHICSDEVICE_CAPABILITY_MULTITHREADED_RENDERING,
GRAPHICSDEVICE_CAPABILITY_CONSERVATIVE_RASTERIZATION,
GRAPHICSDEVICE_CAPABILITY_RASTERIZER_ORDERED_VIEWS,
GRAPHICSDEVICE_CAPABILITY_COUNT,
};
virtual bool CheckCapability(GRAPHICSDEVICE_CAPABILITY capability) = 0;
+66 -34
View File
@@ -1431,8 +1431,6 @@ GraphicsDevice_DX11::GraphicsDevice_DX11(wiWindowRegistration::window_type windo
D3D_FEATURE_LEVEL aquiredFeatureLevel = device->GetFeatureLevel();
DX11 = ((aquiredFeatureLevel >= D3D_FEATURE_LEVEL_11_0) ? true : false);
CONSERVATIVE_RASTERIZATION = aquiredFeatureLevel >= D3D_FEATURE_LEVEL_12_1;
CONSERVATIVE_RASTERIZATION = false; // TODO: correct query!
IDXGIDevice2 * pDXGIDevice;
hr = device->QueryInterface(__uuidof(IDXGIDevice2), (void **)&pDXGIDevice);
@@ -1508,6 +1506,10 @@ GraphicsDevice_DX11::GraphicsDevice_DX11(wiWindowRegistration::window_type windo
DEFERREDCONTEXT_SUPPORT = false;
}
D3D11_FEATURE_DATA_D3D11_OPTIONS2 features_2;
hr = device->CheckFeatureSupport( D3D11_FEATURE_D3D11_OPTIONS2, &features_2, sizeof( features_2 ) );
CONSERVATIVE_RASTERIZATION = features_2.ConservativeRasterizationTier >= D3D11_CONSERVATIVE_RASTERIZATION_TIER_1;
RASTERIZER_ORDERED_VIEWS = features_2.ROVsSupported == TRUE;
// Create a render target view
backBuffer = NULL;
@@ -1577,6 +1579,9 @@ bool GraphicsDevice_DX11::CheckCapability(GRAPHICSDEVICE_CAPABILITY capability)
case wiGraphicsTypes::GraphicsDevice::GRAPHICSDEVICE_CAPABILITY_CONSERVATIVE_RASTERIZATION:
return CONSERVATIVE_RASTERIZATION;
break;
case wiGraphicsTypes::GraphicsDevice::GRAPHICSDEVICE_CAPABILITY_RASTERIZER_ORDERED_VIEWS:
return RASTERIZER_ORDERED_VIEWS;
break;
default:
break;
}
@@ -2377,36 +2382,7 @@ HRESULT GraphicsDevice_DX11::CreateDepthStencilState(const DepthStencilStateDesc
}
HRESULT GraphicsDevice_DX11::CreateRasterizerState(const RasterizerStateDesc *pRasterizerStateDesc, RasterizerState *pRasterizerState)
{
//if (pRasterizerStateDesc->ConservativeRasterizationEnable == TRUE)
//{
// ID3D11Device3* device3 = nullptr;
// if (SUCCEEDED(device->QueryInterface(__uuidof(ID3D11Device3), (void**)&device3)))
// {
// D3D11_RASTERIZER_DESC2 desc;
// desc.FillMode = _ConvertFillMode(pRasterizerStateDesc->FillMode);
// desc.CullMode = _ConvertCullMode(pRasterizerStateDesc->CullMode);
// desc.FrontCounterClockwise = pRasterizerStateDesc->FrontCounterClockwise;
// desc.DepthBias = pRasterizerStateDesc->DepthBias;
// desc.DepthBiasClamp = pRasterizerStateDesc->DepthBiasClamp;
// desc.SlopeScaledDepthBias = pRasterizerStateDesc->SlopeScaledDepthBias;
// desc.DepthClipEnable = pRasterizerStateDesc->DepthClipEnable;
// desc.ScissorEnable = pRasterizerStateDesc->ScissorEnable;
// desc.MultisampleEnable = pRasterizerStateDesc->MultisampleEnable;
// desc.AntialiasedLineEnable = pRasterizerStateDesc->AntialiasedLineEnable;
// desc.ConservativeRaster = D3D11_CONSERVATIVE_RASTERIZATION_MODE_ON;
// desc.ForcedSampleCount = 0;
// pRasterizerState->desc = *pRasterizerStateDesc;
// HRESULT hr = device3->CreateRasterizerState2(&desc, &pRasterizerState->resource_DX11_2);
// SAFE_RELEASE(device3);
// return hr;
// }
//}
//LOCK();
//CONSERVATIVE_RASTERIZATION = false;
//UNLOCK();
pRasterizerState->desc = *pRasterizerStateDesc;
D3D11_RASTERIZER_DESC desc;
desc.FillMode = _ConvertFillMode(pRasterizerStateDesc->FillMode);
@@ -2420,7 +2396,63 @@ HRESULT GraphicsDevice_DX11::CreateRasterizerState(const RasterizerStateDesc *pR
desc.MultisampleEnable = pRasterizerStateDesc->MultisampleEnable;
desc.AntialiasedLineEnable = pRasterizerStateDesc->AntialiasedLineEnable;
pRasterizerState->desc = *pRasterizerStateDesc;
if( CONSERVATIVE_RASTERIZATION && pRasterizerStateDesc->ConservativeRasterizationEnable == TRUE )
{
ID3D11Device3* device3 = nullptr;
if( SUCCEEDED( device->QueryInterface( __uuidof( ID3D11Device3 ), ( void** )&device3 ) ) )
{
D3D11_RASTERIZER_DESC2 desc2;
desc2.FillMode = desc.FillMode;
desc2.CullMode = desc.CullMode;
desc2.FrontCounterClockwise = desc.FrontCounterClockwise;
desc2.DepthBias = desc.DepthBias;
desc2.DepthBiasClamp = desc.DepthBiasClamp;
desc2.SlopeScaledDepthBias = desc.SlopeScaledDepthBias;
desc2.DepthClipEnable = desc.DepthClipEnable;
desc2.ScissorEnable = desc.ScissorEnable;
desc2.MultisampleEnable = desc.MultisampleEnable;
desc2.AntialiasedLineEnable = desc.AntialiasedLineEnable;
desc2.ConservativeRaster = D3D11_CONSERVATIVE_RASTERIZATION_MODE_ON;
desc2.ForcedSampleCount = ( RASTERIZER_ORDERED_VIEWS ? pRasterizerStateDesc->ForcedSampleCount : 0 );
pRasterizerState->desc = *pRasterizerStateDesc;
ID3D11RasterizerState2* rasterizer2 = nullptr;
HRESULT hr = device3->CreateRasterizerState2( &desc2, &rasterizer2 );
pRasterizerState->resource_DX11 = ( ID3D11RasterizerState* )rasterizer2;
SAFE_RELEASE( device3 );
return hr;
}
}
else if( RASTERIZER_ORDERED_VIEWS && pRasterizerStateDesc->ForcedSampleCount > 0 )
{
ID3D11Device1* device1 = nullptr;
if( SUCCEEDED( device->QueryInterface( __uuidof( ID3D11Device1 ), ( void** )&device1 ) ) )
{
D3D11_RASTERIZER_DESC1 desc1;
desc1.FillMode = desc.FillMode;
desc1.CullMode = desc.CullMode;
desc1.FrontCounterClockwise = desc.FrontCounterClockwise;
desc1.DepthBias = desc.DepthBias;
desc1.DepthBiasClamp = desc.DepthBiasClamp;
desc1.SlopeScaledDepthBias = desc.SlopeScaledDepthBias;
desc1.DepthClipEnable = desc.DepthClipEnable;
desc1.ScissorEnable = desc.ScissorEnable;
desc1.MultisampleEnable = desc.MultisampleEnable;
desc1.AntialiasedLineEnable = desc.AntialiasedLineEnable;
desc1.ForcedSampleCount = pRasterizerStateDesc->ForcedSampleCount;
pRasterizerState->desc = *pRasterizerStateDesc;
ID3D11RasterizerState1* rasterizer1 = nullptr;
HRESULT hr = device1->CreateRasterizerState1( &desc1, &rasterizer1 );
pRasterizerState->resource_DX11 = ( ID3D11RasterizerState* )rasterizer1;
SAFE_RELEASE( device1 );
return hr;
}
}
return device->CreateRasterizerState(&desc, &pRasterizerState->resource_DX11);
}
HRESULT GraphicsDevice_DX11::CreateSamplerState(const SamplerDesc *pSamplerDesc, Sampler *pSamplerState)
@@ -2759,7 +2791,7 @@ void GraphicsDevice_DX11::BindDepthStencilState(const DepthStencilState* state,
}
void GraphicsDevice_DX11::BindRasterizerState(const RasterizerState* state, GRAPHICSTHREAD threadID)
{
deviceContexts[threadID]->RSSetState(state->resource_DX11_2 != nullptr ? state->resource_DX11_2 : state->resource_DX11);
deviceContexts[threadID]->RSSetState(state->resource_DX11);
}
void GraphicsDevice_DX11::BindStreamOutTarget(const GPUBuffer* buffer, GRAPHICSTHREAD threadID)
{
+1 -1
View File
@@ -28,7 +28,7 @@ namespace wiGraphicsTypes
ViewPort viewPort;
ID3D11DeviceContext* deviceContexts[GRAPHICSTHREAD_COUNT];
ID3D11CommandList* commandLists[GRAPHICSTHREAD_COUNT];
bool DX11, DEFERREDCONTEXT_SUPPORT, CONSERVATIVE_RASTERIZATION;
bool DX11, DEFERREDCONTEXT_SUPPORT, CONSERVATIVE_RASTERIZATION, RASTERIZER_ORDERED_VIEWS;
ID3DUserDefinedAnnotation* userDefinedAnnotations[GRAPHICSTHREAD_COUNT];
public:
-2
View File
@@ -123,12 +123,10 @@ namespace wiGraphicsTypes
RasterizerState::RasterizerState()
{
SAFE_INIT(resource_DX11);
SAFE_INIT(resource_DX11_2);
}
RasterizerState::~RasterizerState()
{
SAFE_RELEASE(resource_DX11);
SAFE_RELEASE(resource_DX11_2);
}
ClassLinkage::ClassLinkage()
-1
View File
@@ -199,7 +199,6 @@ namespace wiGraphicsTypes
friend class GraphicsDevice_DX11;
private:
ID3D11RasterizerState* resource_DX11;
ID3D11RasterizerState2* resource_DX11_2;
RasterizerStateDesc desc;
public:
RasterizerState();
+6 -5
View File
@@ -1033,7 +1033,7 @@ void wiRenderer::SetUpStates()
rs.ScissorEnable = false;
rs.MultisampleEnable = false;
rs.AntialiasedLineEnable = false;
rs.ConservativeRasterizationEnable = true;
rs.ConservativeRasterizationEnable = false; // do it in the shader for now...
GetDevice()->CreateRasterizerState(&rs, rasterizers[RSTYPE_VOXELIZE]);
for (int i = 0; i < DSSTYPE_LAST; ++i)
@@ -3941,10 +3941,11 @@ void wiRenderer::VoxelizeScene(GRAPHICSTHREAD threadID)
{
return;
}
//if (!GetDevice()->CheckCapability(GraphicsDevice::GRAPHICSDEVICE_CAPABILITY_CONSERVATIVE_RASTERIZATION))
//{
// return;
//}
if( !GetDevice()->CheckCapability( GraphicsDevice::GRAPHICSDEVICE_CAPABILITY_RASTERIZER_ORDERED_VIEWS ) )
{
// TODO: support
return;
}
GetDevice()->EventBegin("Voxelize Scene", threadID);
wiProfiler::GetInstance().BeginRange("Voxelize Scene", wiProfiler::DOMAIN_GPU, threadID);
+1 -1
View File
@@ -7,7 +7,7 @@ namespace wiVersion
// minor features, major updates
const int minor = 11;
// minor bug fixes, alterations, refactors, updates
const int revision = 1;
const int revision = 2;
long GetVersion()