You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
o3de/Code/CryEngine/RenderDll/XRenderD3D9/DeviceManager/DeviceManagerInline.h

286 lines
9.3 KiB
C

/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
// Original file Copyright Crytek GMBH or its affiliates, used under license.
#ifndef CRYINCLUDE_CRYENGINE_RENDERDLL_XRENDERD3D9_DEVICEMANAGER_DEVICEMANAGERINLINE_H
#define CRYINCLUDE_CRYENGINE_RENDERDLL_XRENDERD3D9_DEVICEMANAGER_DEVICEMANAGERINLINE_H
#pragma once
#if !defined(NULL_RENDERER) && DEVICE_MANAGER_IMMEDIATE_STATE_WRITE
#include "../DriverD3D.h"
#endif
//===============================================================================================================
//
// Inline implementation for CDeviceManager
//
//===============================================================================================================
#if !defined(NULL_RENDERER)
inline void CDeviceManager::BindSRV(EHWShaderClass type, D3DShaderResourceView* SRV, uint32 slot)
{
#if DEVICE_MANAGER_IMMEDIATE_STATE_WRITE
D3DDeviceContext& rDeviceContext = gcpRendD3D->GetDeviceContext();
switch (type)
{
case eHWSC_Vertex:
rDeviceContext.VSSetShaderResources(slot, 1, &SRV);
break;
case eHWSC_Pixel:
rDeviceContext.PSSetShaderResources(slot, 1, &SRV);
break;
case eHWSC_Geometry:
rDeviceContext.GSSetShaderResources(slot, 1, &SRV);
break;
case eHWSC_Domain:
rDeviceContext.DSSetShaderResources(slot, 1, &SRV);
break;
case eHWSC_Hull:
rDeviceContext.HSSetShaderResources(slot, 1, &SRV);
break;
case eHWSC_Compute:
rDeviceContext.CSSetShaderResources(slot, 1, &SRV);
break;
}
#else
const unsigned dirty_base = slot >> SRV_DIRTY_SHIFT;
const unsigned dirty_bit = slot & SRV_DIRTY_MASK;
m_SRV[type].views[slot] = SRV;
m_SRV[type].dirty[dirty_base] |= 1 << dirty_bit;
#endif
}
inline void CDeviceManager::BindSRV(EHWShaderClass type, D3DShaderResourceView** SRV, uint32 start_slot, uint32 count)
{
for (unsigned i = 0; i < count; ++i)
{
BindSRV(type, SRV[i], i + start_slot);
}
}
inline void CDeviceManager::BindUAV(EHWShaderClass type, D3DUnorderedAccessView* UAV, uint32 count, uint32 slot)
{
#if DEVICE_MANAGER_IMMEDIATE_STATE_WRITE
D3DDeviceContext& rDeviceContext = gcpRendD3D->GetDeviceContext();
switch (type)
{
case eHWSC_Vertex:
assert(0 && "NOT IMPLEMENTED ON D3D11.0");
break;
case eHWSC_Pixel:
rDeviceContext.OMSetRenderTargetsAndUnorderedAccessViews(D3D11_KEEP_RENDER_TARGETS_AND_DEPTH_STENCIL, NULL, NULL, slot, 1, &UAV, &count);
break;
case eHWSC_Geometry:
assert(0 && "NOT IMPLEMENTED ON D3D11.0");
break;
case eHWSC_Domain:
assert(0 && "NOT IMPLEMENTED ON D3D11.0");
break;
case eHWSC_Hull:
assert(0 && "NOT IMPLEMENTED ON D3D11.0");
break;
case eHWSC_Compute:
rDeviceContext.CSSetUnorderedAccessViews(slot, 1, &UAV, &count);
break;
}
#else
const unsigned dirty_base = slot >> UAV_DIRTY_SHIFT;
const unsigned dirty_bit = slot & UAV_DIRTY_MASK;
m_UAV[type].views[slot] = UAV;
m_UAV[type].counts[slot] = count;
m_UAV[type].dirty[dirty_base] |= 1 << dirty_bit;
#endif
}
inline void CDeviceManager::BindUAV(EHWShaderClass type, D3DUnorderedAccessView** UAV, const uint32* counts, uint32 start_slot, uint32 count)
{
for (unsigned i = 0; i < count; ++i)
{
BindUAV(type, UAV[i], (counts ? counts[i] : -1), i + start_slot);
}
}
inline void CDeviceManager::BindSampler(EHWShaderClass type, D3DSamplerState* Sampler, uint32 slot)
{
#if DEVICE_MANAGER_IMMEDIATE_STATE_WRITE
D3DDeviceContext& rDeviceContext = gcpRendD3D->GetDeviceContext();
switch (type)
{
case eHWSC_Vertex:
rDeviceContext.VSSetSamplers(slot, 1, &Sampler);
break;
case eHWSC_Pixel:
rDeviceContext.PSSetSamplers(slot, 1, &Sampler);
break;
case eHWSC_Geometry:
rDeviceContext.GSSetSamplers(slot, 1, &Sampler);
break;
case eHWSC_Domain:
rDeviceContext.DSSetSamplers(slot, 1, &Sampler);
break;
case eHWSC_Hull:
rDeviceContext.HSSetSamplers(slot, 1, &Sampler);
break;
case eHWSC_Compute:
rDeviceContext.CSSetSamplers(slot, 1, &Sampler);
break;
}
#else
if (Sampler != m_Samplers[type].samplers[slot])
{
m_Samplers[type].samplers[slot] = Sampler;
m_Samplers[type].dirty |= 1 << slot;
}
#endif
}
inline void CDeviceManager::BindSampler(EHWShaderClass type, D3DSamplerState** Samplers, uint32 start_slot, uint32 count)
{
for (unsigned i = 0; i < count; ++i)
{
BindSampler(type, Samplers[i], i + start_slot);
}
}
inline void CDeviceManager::BindVB(D3DBuffer* Buffer, uint32 slot, uint32 offset, uint32 stride)
{
#if DEVICE_MANAGER_IMMEDIATE_STATE_WRITE
D3DDeviceContext& rDeviceContext = gcpRendD3D->GetDeviceContext();
rDeviceContext.IASetVertexBuffers(slot, 1, &Buffer, &stride, &offset);
#else
m_VBs.buffers[slot] = Buffer;
m_VBs.offsets[slot] = offset;
m_VBs.strides[slot] = stride;
m_VBs.dirty |= 1 << slot;
#endif
}
inline void CDeviceManager::BindVB(uint32 start, uint32 count, D3DBuffer** Buffers, uint32* offset, uint32* stride)
{
for (size_t i = 0; i < count; ++i)
{
BindVB(Buffers[i], start + i, offset[i], stride[i]);
}
}
inline void CDeviceManager::BindIB(D3DBuffer* Buffer, uint32 offset, DXGI_FORMAT format)
{
#if DEVICE_MANAGER_IMMEDIATE_STATE_WRITE
D3DDeviceContext& rDeviceContext = gcpRendD3D->GetDeviceContext();
rDeviceContext.IASetIndexBuffer(Buffer, format, offset);
#else
m_IB.buffer = Buffer;
m_IB.offset = offset;
m_IB.format = format;
m_IB.dirty = 1;
#endif
}
inline void CDeviceManager::BindVtxDecl(D3DVertexDeclaration* decl)
{
#if DEVICE_MANAGER_IMMEDIATE_STATE_WRITE
D3DDeviceContext& rDeviceContext = gcpRendD3D->GetDeviceContext();
rDeviceContext.IASetInputLayout(decl);
#else
m_VertexDecl.decl = decl;
m_VertexDecl.dirty = true;
#endif
}
inline void CDeviceManager::BindTopology(D3D11_PRIMITIVE_TOPOLOGY top)
{
#if DEVICE_MANAGER_IMMEDIATE_STATE_WRITE
D3DDeviceContext& rDeviceContext = gcpRendD3D->GetDeviceContext();
rDeviceContext.IASetPrimitiveTopology(top);
#else
m_Topology.topology = top;
m_Topology.dirty = true;
#endif
}
inline void CDeviceManager::BindShader(EHWShaderClass type, ID3D11Resource* shader)
{
#if DEVICE_MANAGER_IMMEDIATE_STATE_WRITE
D3DDeviceContext& rDeviceContext = gcpRendD3D->GetDeviceContext();
switch (type)
{
case eHWSC_Vertex:
rDeviceContext.VSSetShader((D3DVertexShader*)shader, NULL, 0);
break;
case eHWSC_Pixel:
rDeviceContext.PSSetShader((D3DPixelShader*)shader, NULL, 0);
break;
case eHWSC_Hull:
rDeviceContext.HSSetShader((ID3D11HullShader*)shader, NULL, 0);
break;
case eHWSC_Geometry:
rDeviceContext.GSSetShader((ID3D11GeometryShader*)shader, NULL, 0);
break;
case eHWSC_Domain:
rDeviceContext.DSSetShader((ID3D11DomainShader*)shader, NULL, 0);
break;
case eHWSC_Compute:
rDeviceContext.CSSetShader((ID3D11ComputeShader*)shader, NULL, 0);
break;
}
#else
m_Shaders[type].shader = shader;
m_Shaders[type].dirty = true;
#endif
}
inline void CDeviceManager::SetDepthStencilState(ID3D11DepthStencilState* dss, uint32 stencilref)
{
#if DEVICE_MANAGER_IMMEDIATE_STATE_WRITE
D3DDeviceContext& rDeviceContext = gcpRendD3D->GetDeviceContext();
rDeviceContext.OMSetDepthStencilState(dss, stencilref);
#else
m_DepthStencilState.dss = dss;
m_DepthStencilState.stencilref = stencilref;
m_DepthStencilState.dirty = true;
#endif
}
inline void CDeviceManager::SetBlendState(ID3D11BlendState* pBlendState, float* BlendFactor, uint32 SampleMask)
{
#if DEVICE_MANAGER_IMMEDIATE_STATE_WRITE
D3DDeviceContext& rDeviceContext = gcpRendD3D->GetDeviceContext();
rDeviceContext.OMSetBlendState(pBlendState, BlendFactor, SampleMask);
#else
m_BlendState.pBlendState = pBlendState;
if (BlendFactor)
{
for (size_t i = 0; i < 4; ++i)
{
m_BlendState.BlendFactor[i] = BlendFactor[i];
}
}
else
{
for (size_t i = 0; i < 4; ++i)
{
m_BlendState.BlendFactor[i] = 1.f;
}
}
m_BlendState.SampleMask = SampleMask;
m_BlendState.dirty = true;
#endif
}
inline void CDeviceManager::SetRasterState(ID3D11RasterizerState* pRasterizerState)
{
#if DEVICE_MANAGER_IMMEDIATE_STATE_WRITE
D3DDeviceContext& rDeviceContext = gcpRendD3D->GetDeviceContext();
rDeviceContext.RSSetState(pRasterizerState);
#else
m_RasterState.pRasterizerState = pRasterizerState;
m_RasterState.dirty = true;
#endif
}
#if DEVICE_MANAGER_IMMEDIATE_STATE_WRITE
ILINE void CDeviceManager::CommitDeviceStates()
{
// Nothing to do for DEVICE_MANAGER_IMMEDIATE_STATE_WRITE
}
#endif
#endif
//====================================================================================================
#endif // _DeviceManager_H_