From 86554a2ba509bf689eaafecf256b93dd79d55aff Mon Sep 17 00:00:00 2001 From: turanszkij Date: Thu, 2 Mar 2017 15:23:06 +0100 Subject: [PATCH] Added support for feature: Rasterizer Ordered Views --- WickedEngine/ResourceMapping.h | 43 ++++------- WickedEngine/objectPS_voxelizer.hlsl | 4 +- WickedEngine/wiGraphicsDescriptors.h | 79 ++++++++++++------- WickedEngine/wiGraphicsDevice.h | 1 + WickedEngine/wiGraphicsDevice_DX11.cpp | 100 ++++++++++++++++--------- WickedEngine/wiGraphicsDevice_DX11.h | 2 +- WickedEngine/wiGraphicsResource.cpp | 2 - WickedEngine/wiGraphicsResource.h | 1 - WickedEngine/wiRenderer.cpp | 11 +-- WickedEngine/wiVersion.cpp | 2 +- 10 files changed, 146 insertions(+), 99 deletions(-) diff --git a/WickedEngine/ResourceMapping.h b/WickedEngine/ResourceMapping.h index bc1692730..b29833416 100644 --- a/WickedEngine/ResourceMapping.h +++ b/WickedEngine/ResourceMapping.h @@ -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_ diff --git a/WickedEngine/objectPS_voxelizer.hlsl b/WickedEngine/objectPS_voxelizer.hlsl index 967cc72bd..612524b27 100644 --- a/WickedEngine/objectPS_voxelizer.hlsl +++ b/WickedEngine/objectPS_voxelizer.hlsl @@ -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) { diff --git a/WickedEngine/wiGraphicsDescriptors.h b/WickedEngine/wiGraphicsDescriptors.h index 19ab364da..646782f1c 100644 --- a/WickedEngine/wiGraphicsDescriptors.h +++ b/WickedEngine/wiGraphicsDescriptors.h @@ -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 diff --git a/WickedEngine/wiGraphicsDevice.h b/WickedEngine/wiGraphicsDevice.h index 532934ae3..80f274222 100644 --- a/WickedEngine/wiGraphicsDevice.h +++ b/WickedEngine/wiGraphicsDevice.h @@ -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; diff --git a/WickedEngine/wiGraphicsDevice_DX11.cpp b/WickedEngine/wiGraphicsDevice_DX11.cpp index 7642d56c7..d39123e7b 100644 --- a/WickedEngine/wiGraphicsDevice_DX11.cpp +++ b/WickedEngine/wiGraphicsDevice_DX11.cpp @@ -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) { diff --git a/WickedEngine/wiGraphicsDevice_DX11.h b/WickedEngine/wiGraphicsDevice_DX11.h index 781c2e804..37775f55d 100644 --- a/WickedEngine/wiGraphicsDevice_DX11.h +++ b/WickedEngine/wiGraphicsDevice_DX11.h @@ -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: diff --git a/WickedEngine/wiGraphicsResource.cpp b/WickedEngine/wiGraphicsResource.cpp index b55038642..c02c26f50 100644 --- a/WickedEngine/wiGraphicsResource.cpp +++ b/WickedEngine/wiGraphicsResource.cpp @@ -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() diff --git a/WickedEngine/wiGraphicsResource.h b/WickedEngine/wiGraphicsResource.h index a5026daac..399feef90 100644 --- a/WickedEngine/wiGraphicsResource.h +++ b/WickedEngine/wiGraphicsResource.h @@ -199,7 +199,6 @@ namespace wiGraphicsTypes friend class GraphicsDevice_DX11; private: ID3D11RasterizerState* resource_DX11; - ID3D11RasterizerState2* resource_DX11_2; RasterizerStateDesc desc; public: RasterizerState(); diff --git a/WickedEngine/wiRenderer.cpp b/WickedEngine/wiRenderer.cpp index bd3c89a0a..5d85fbe6e 100644 --- a/WickedEngine/wiRenderer.cpp +++ b/WickedEngine/wiRenderer.cpp @@ -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); diff --git a/WickedEngine/wiVersion.cpp b/WickedEngine/wiVersion.cpp index d8d4ae170..325b2cb08 100644 --- a/WickedEngine/wiVersion.cpp +++ b/WickedEngine/wiVersion.cpp @@ -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()