summaryrefslogtreecommitdiffstats
path: root/src/libs/dxvk-native-1.9.2a/src/d3d11/d3d11_rasterizer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/libs/dxvk-native-1.9.2a/src/d3d11/d3d11_rasterizer.cpp')
-rw-r--r--src/libs/dxvk-native-1.9.2a/src/d3d11/d3d11_rasterizer.cpp195
1 files changed, 195 insertions, 0 deletions
diff --git a/src/libs/dxvk-native-1.9.2a/src/d3d11/d3d11_rasterizer.cpp b/src/libs/dxvk-native-1.9.2a/src/d3d11/d3d11_rasterizer.cpp
new file mode 100644
index 00000000..6d70847e
--- /dev/null
+++ b/src/libs/dxvk-native-1.9.2a/src/d3d11/d3d11_rasterizer.cpp
@@ -0,0 +1,195 @@
+#include "d3d11_device.h"
+#include "d3d11_rasterizer.h"
+
+namespace dxvk {
+
+ D3D11RasterizerState::D3D11RasterizerState(
+ D3D11Device* device,
+ const D3D11_RASTERIZER_DESC2& desc)
+ : D3D11StateObject<ID3D11RasterizerState2>(device),
+ m_desc(desc), m_d3d10(this) {
+ // Polygon mode. Determines whether the rasterizer fills
+ // a polygon or renders lines connecting the vertices.
+ switch (desc.FillMode) {
+ default:
+ case D3D11_FILL_SOLID: m_state.polygonMode = VK_POLYGON_MODE_FILL; break;
+ case D3D11_FILL_WIREFRAME: m_state.polygonMode = VK_POLYGON_MODE_LINE; break;
+ }
+
+ // Face culling properties. The rasterizer may discard
+ // polygons that are facing towards or away from the
+ // viewer, depending on the options below.
+ switch (desc.CullMode) {
+ default:
+ case D3D11_CULL_NONE: m_state.cullMode = VK_CULL_MODE_NONE; break;
+ case D3D11_CULL_FRONT: m_state.cullMode = VK_CULL_MODE_FRONT_BIT; break;
+ case D3D11_CULL_BACK: m_state.cullMode = VK_CULL_MODE_BACK_BIT; break;
+ }
+
+ m_state.frontFace = desc.FrontCounterClockwise
+ ? VK_FRONT_FACE_COUNTER_CLOCKWISE
+ : VK_FRONT_FACE_CLOCKWISE;
+
+ // In the backend we treat depth bias as a dynamic state because
+ // some games like to put random/uninitialized numbers here, but
+ // we do not need to enable it in case the parameters are both 0.
+ m_state.depthBiasEnable = desc.DepthBias != 0 || desc.SlopeScaledDepthBias != 0.0f;
+ m_state.depthClipEnable = desc.DepthClipEnable;
+ m_state.conservativeMode = DecodeConservativeRasterizationMode(desc.ConservativeRaster);
+ m_state.sampleCount = VkSampleCountFlags(desc.ForcedSampleCount);
+
+ m_depthBias.depthBiasConstant = float(desc.DepthBias);
+ m_depthBias.depthBiasSlope = desc.SlopeScaledDepthBias;
+ m_depthBias.depthBiasClamp = desc.DepthBiasClamp;
+
+ if (desc.AntialiasedLineEnable)
+ Logger::err("D3D11RasterizerState: Antialiased lines not supported");
+ }
+
+
+ D3D11RasterizerState::~D3D11RasterizerState() {
+
+ }
+
+
+ HRESULT STDMETHODCALLTYPE D3D11RasterizerState::QueryInterface(REFIID riid, void** ppvObject) {
+ if (ppvObject == nullptr)
+ return E_POINTER;
+
+ *ppvObject = nullptr;
+
+ if (riid == __uuidof(IUnknown)
+ || riid == __uuidof(ID3D11DeviceChild)
+ || riid == __uuidof(ID3D11RasterizerState)
+ || riid == __uuidof(ID3D11RasterizerState1)
+ || riid == __uuidof(ID3D11RasterizerState2)) {
+ *ppvObject = ref(this);
+ return S_OK;
+ }
+
+ if (riid == __uuidof(ID3D10DeviceChild)
+ || riid == __uuidof(ID3D10RasterizerState)) {
+ *ppvObject = ref(&m_d3d10);
+ return S_OK;
+ }
+
+ Logger::warn("D3D11RasterizerState::QueryInterface: Unknown interface query");
+ Logger::warn(str::format(riid));
+ return E_NOINTERFACE;
+ }
+
+
+ void STDMETHODCALLTYPE D3D11RasterizerState::GetDesc(D3D11_RASTERIZER_DESC* pDesc) {
+ pDesc->FillMode = m_desc.FillMode;
+ pDesc->CullMode = m_desc.CullMode;
+ pDesc->FrontCounterClockwise = m_desc.FrontCounterClockwise;
+ pDesc->DepthBias = m_desc.DepthBias;
+ pDesc->DepthBiasClamp = m_desc.DepthBiasClamp;
+ pDesc->SlopeScaledDepthBias = m_desc.SlopeScaledDepthBias;
+ pDesc->DepthClipEnable = m_desc.DepthClipEnable;
+ pDesc->ScissorEnable = m_desc.ScissorEnable;
+ pDesc->MultisampleEnable = m_desc.MultisampleEnable;
+ pDesc->AntialiasedLineEnable = m_desc.AntialiasedLineEnable;
+ }
+
+
+ void STDMETHODCALLTYPE D3D11RasterizerState::GetDesc1(D3D11_RASTERIZER_DESC1* pDesc) {
+ pDesc->FillMode = m_desc.FillMode;
+ pDesc->CullMode = m_desc.CullMode;
+ pDesc->FrontCounterClockwise = m_desc.FrontCounterClockwise;
+ pDesc->DepthBias = m_desc.DepthBias;
+ pDesc->DepthBiasClamp = m_desc.DepthBiasClamp;
+ pDesc->SlopeScaledDepthBias = m_desc.SlopeScaledDepthBias;
+ pDesc->DepthClipEnable = m_desc.DepthClipEnable;
+ pDesc->ScissorEnable = m_desc.ScissorEnable;
+ pDesc->MultisampleEnable = m_desc.MultisampleEnable;
+ pDesc->AntialiasedLineEnable = m_desc.AntialiasedLineEnable;
+ pDesc->ForcedSampleCount = m_desc.ForcedSampleCount;
+ }
+
+
+ void STDMETHODCALLTYPE D3D11RasterizerState::GetDesc2(D3D11_RASTERIZER_DESC2* pDesc) {
+ *pDesc = m_desc;
+ }
+
+
+ void D3D11RasterizerState::BindToContext(const Rc<DxvkContext>& ctx) {
+ ctx->setRasterizerState(m_state);
+
+ if (m_state.depthBiasEnable)
+ ctx->setDepthBias(m_depthBias);
+ }
+
+
+ D3D11_RASTERIZER_DESC2 D3D11RasterizerState::PromoteDesc(
+ const D3D11_RASTERIZER_DESC* pSrcDesc) {
+ D3D11_RASTERIZER_DESC2 dstDesc;
+ dstDesc.FillMode = pSrcDesc->FillMode;
+ dstDesc.CullMode = pSrcDesc->CullMode;
+ dstDesc.FrontCounterClockwise = pSrcDesc->FrontCounterClockwise;
+ dstDesc.DepthBias = pSrcDesc->DepthBias;
+ dstDesc.DepthBiasClamp = pSrcDesc->DepthBiasClamp;
+ dstDesc.SlopeScaledDepthBias = pSrcDesc->SlopeScaledDepthBias;
+ dstDesc.DepthClipEnable = pSrcDesc->DepthClipEnable;
+ dstDesc.ScissorEnable = pSrcDesc->ScissorEnable;
+ dstDesc.MultisampleEnable = pSrcDesc->MultisampleEnable;
+ dstDesc.AntialiasedLineEnable = pSrcDesc->AntialiasedLineEnable;
+ dstDesc.ForcedSampleCount = 0;
+ dstDesc.ConservativeRaster = D3D11_CONSERVATIVE_RASTERIZATION_MODE_OFF;
+ return dstDesc;
+ }
+
+
+ D3D11_RASTERIZER_DESC2 D3D11RasterizerState::PromoteDesc(
+ const D3D11_RASTERIZER_DESC1* pSrcDesc) {
+ D3D11_RASTERIZER_DESC2 dstDesc;
+ dstDesc.FillMode = pSrcDesc->FillMode;
+ dstDesc.CullMode = pSrcDesc->CullMode;
+ dstDesc.FrontCounterClockwise = pSrcDesc->FrontCounterClockwise;
+ dstDesc.DepthBias = pSrcDesc->DepthBias;
+ dstDesc.DepthBiasClamp = pSrcDesc->DepthBiasClamp;
+ dstDesc.SlopeScaledDepthBias = pSrcDesc->SlopeScaledDepthBias;
+ dstDesc.DepthClipEnable = pSrcDesc->DepthClipEnable;
+ dstDesc.ScissorEnable = pSrcDesc->ScissorEnable;
+ dstDesc.MultisampleEnable = pSrcDesc->MultisampleEnable;
+ dstDesc.AntialiasedLineEnable = pSrcDesc->AntialiasedLineEnable;
+ dstDesc.ForcedSampleCount = 0;
+ dstDesc.ConservativeRaster = D3D11_CONSERVATIVE_RASTERIZATION_MODE_OFF;
+ return dstDesc;
+ }
+
+
+ HRESULT D3D11RasterizerState::NormalizeDesc(
+ D3D11_RASTERIZER_DESC2* pDesc) {
+ if (pDesc->FillMode < D3D11_FILL_WIREFRAME
+ || pDesc->FillMode > D3D11_FILL_SOLID)
+ return E_INVALIDARG;
+
+ if (pDesc->CullMode < D3D11_CULL_NONE
+ || pDesc->CullMode > D3D11_CULL_BACK)
+ return E_INVALIDARG;
+
+ if (pDesc->FrontCounterClockwise)
+ pDesc->FrontCounterClockwise = TRUE;
+
+ if (pDesc->DepthClipEnable)
+ pDesc->DepthClipEnable = TRUE;
+
+ if (pDesc->ScissorEnable)
+ pDesc->ScissorEnable = TRUE;
+
+ if (pDesc->MultisampleEnable)
+ pDesc->MultisampleEnable = TRUE;
+
+ if (pDesc->AntialiasedLineEnable)
+ pDesc->AntialiasedLineEnable = TRUE;
+
+ if (pDesc->ForcedSampleCount != 0) {
+ if (FAILED(DecodeSampleCount(pDesc->ForcedSampleCount, nullptr)))
+ return E_INVALIDARG;
+ }
+
+ return S_OK;
+ }
+
+}