mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-02-21 22:54:16 +01:00
[dxso] Use SSBOs for vertex constant buffers if we'd be outside of uniform range
Impacts #1375
This commit is contained in:
parent
d11a07082c
commit
2408b881a2
@ -49,7 +49,6 @@ namespace dxvk {
|
|||||||
, m_multithread ( BehaviorFlags & D3DCREATE_MULTITHREADED )
|
, m_multithread ( BehaviorFlags & D3DCREATE_MULTITHREADED )
|
||||||
, m_shaderModules ( new D3D9ShaderModuleSet )
|
, m_shaderModules ( new D3D9ShaderModuleSet )
|
||||||
, m_d3d9Options ( dxvkDevice, pParent->GetInstance()->config() )
|
, m_d3d9Options ( dxvkDevice, pParent->GetInstance()->config() )
|
||||||
, m_dxsoOptions ( m_dxvkDevice, m_d3d9Options )
|
|
||||||
, m_isSWVP ( (BehaviorFlags & D3DCREATE_SOFTWARE_VERTEXPROCESSING) ? TRUE : FALSE ) {
|
, m_isSWVP ( (BehaviorFlags & D3DCREATE_SOFTWARE_VERTEXPROCESSING) ? TRUE : FALSE ) {
|
||||||
// If we can SWVP, then we use an extended constant set
|
// If we can SWVP, then we use an extended constant set
|
||||||
// as SWVP has many more slots available than HWVP.
|
// as SWVP has many more slots available than HWVP.
|
||||||
@ -73,11 +72,13 @@ namespace dxvk {
|
|||||||
ctx->setLogicOpState(loState);
|
ctx->setLogicOpState(loState);
|
||||||
});
|
});
|
||||||
|
|
||||||
CreateConstantBuffers();
|
|
||||||
|
|
||||||
if (!(BehaviorFlags & D3DCREATE_FPU_PRESERVE))
|
if (!(BehaviorFlags & D3DCREATE_FPU_PRESERVE))
|
||||||
SetupFPU();
|
SetupFPU();
|
||||||
|
|
||||||
|
m_dxsoOptions = DxsoOptions(this, m_d3d9Options);
|
||||||
|
|
||||||
|
CreateConstantBuffers();
|
||||||
|
|
||||||
m_availableMemory = DetermineInitialTextureMemory();
|
m_availableMemory = DetermineInitialTextureMemory();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4468,7 +4469,7 @@ namespace dxvk {
|
|||||||
|
|
||||||
void D3D9DeviceEx::CreateConstantBuffers() {
|
void D3D9DeviceEx::CreateConstantBuffers() {
|
||||||
m_consts[DxsoProgramTypes::VertexShader].buffer =
|
m_consts[DxsoProgramTypes::VertexShader].buffer =
|
||||||
CreateConstantBuffer(false,
|
CreateConstantBuffer(m_dxsoOptions.vertexConstantBufferAsSSBO,
|
||||||
m_vsLayout.totalSize(),
|
m_vsLayout.totalSize(),
|
||||||
DxsoProgramType::VertexShader,
|
DxsoProgramType::VertexShader,
|
||||||
DxsoConstantBuffers::VSConstantBuffer);
|
DxsoConstantBuffers::VSConstantBuffer);
|
||||||
|
@ -992,7 +992,7 @@ namespace dxvk {
|
|||||||
D3D9UPBufferSlice m_upBuffer;
|
D3D9UPBufferSlice m_upBuffer;
|
||||||
|
|
||||||
const D3D9Options m_d3d9Options;
|
const D3D9Options m_d3d9Options;
|
||||||
const DxsoOptions m_dxsoOptions;
|
DxsoOptions m_dxsoOptions;
|
||||||
|
|
||||||
BOOL m_isSWVP;
|
BOOL m_isSWVP;
|
||||||
|
|
||||||
|
@ -274,6 +274,9 @@ namespace dxvk {
|
|||||||
|
|
||||||
|
|
||||||
void DxsoCompiler::emitDclConstantBuffer() {
|
void DxsoCompiler::emitDclConstantBuffer() {
|
||||||
|
const bool asSsbo = m_moduleInfo.options.vertexConstantBufferAsSSBO &&
|
||||||
|
m_programInfo.type() == DxsoProgramType::VertexShader;
|
||||||
|
|
||||||
std::array<uint32_t, 3> members = {
|
std::array<uint32_t, 3> members = {
|
||||||
// float f[256 or 224 or 8192]
|
// float f[256 or 224 or 8192]
|
||||||
m_module.defArrayTypeUnique(
|
m_module.defArrayTypeUnique(
|
||||||
@ -309,7 +312,9 @@ namespace dxvk {
|
|||||||
const uint32_t structType =
|
const uint32_t structType =
|
||||||
m_module.defStructType(swvp ? 3 : 2, members.data());
|
m_module.defStructType(swvp ? 3 : 2, members.data());
|
||||||
|
|
||||||
m_module.decorateBlock(structType);
|
m_module.decorate(structType, asSsbo
|
||||||
|
? spv::DecorationBufferBlock
|
||||||
|
: spv::DecorationBlock);
|
||||||
|
|
||||||
m_module.memberDecorateOffset(structType, 0, m_layout->floatOffset());
|
m_module.memberDecorateOffset(structType, 0, m_layout->floatOffset());
|
||||||
m_module.memberDecorateOffset(structType, 1, m_layout->intOffset());
|
m_module.memberDecorateOffset(structType, 1, m_layout->intOffset());
|
||||||
@ -337,9 +342,14 @@ namespace dxvk {
|
|||||||
m_module.decorateDescriptorSet(m_cBuffer, 0);
|
m_module.decorateDescriptorSet(m_cBuffer, 0);
|
||||||
m_module.decorateBinding(m_cBuffer, bindingId);
|
m_module.decorateBinding(m_cBuffer, bindingId);
|
||||||
|
|
||||||
|
if (asSsbo)
|
||||||
|
m_module.decorate(m_cBuffer, spv::DecorationNonWritable);
|
||||||
|
|
||||||
DxvkResourceSlot resource;
|
DxvkResourceSlot resource;
|
||||||
resource.slot = bindingId;
|
resource.slot = bindingId;
|
||||||
resource.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
|
resource.type = asSsbo
|
||||||
|
? VK_DESCRIPTOR_TYPE_STORAGE_BUFFER
|
||||||
|
: VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
|
||||||
resource.view = VK_IMAGE_VIEW_TYPE_MAX_ENUM;
|
resource.view = VK_IMAGE_VIEW_TYPE_MAX_ENUM;
|
||||||
resource.access = VK_ACCESS_UNIFORM_READ_BIT;
|
resource.access = VK_ACCESS_UNIFORM_READ_BIT;
|
||||||
m_resourceSlots.push_back(resource);
|
m_resourceSlots.push_back(resource);
|
||||||
|
@ -1,10 +1,14 @@
|
|||||||
#include "dxso_options.h"
|
#include "dxso_options.h"
|
||||||
|
|
||||||
|
#include "../d3d9/d3d9_device.h"
|
||||||
|
|
||||||
namespace dxvk {
|
namespace dxvk {
|
||||||
|
|
||||||
DxsoOptions::DxsoOptions() {}
|
DxsoOptions::DxsoOptions() {}
|
||||||
|
|
||||||
DxsoOptions::DxsoOptions(const Rc<DxvkDevice>& device, const D3D9Options& options) {
|
DxsoOptions::DxsoOptions(D3D9DeviceEx* pDevice, const D3D9Options& options) {
|
||||||
|
const Rc<DxvkDevice> device = pDevice->GetDXVKDevice();
|
||||||
|
|
||||||
const Rc<DxvkAdapter> adapter = device->adapter();
|
const Rc<DxvkAdapter> adapter = device->adapter();
|
||||||
|
|
||||||
const DxvkDeviceFeatures& devFeatures = device->features();
|
const DxvkDeviceFeatures& devFeatures = device->features();
|
||||||
@ -39,6 +43,8 @@ namespace dxvk {
|
|||||||
invariantPosition = options.invariantPosition;
|
invariantPosition = options.invariantPosition;
|
||||||
|
|
||||||
forceSamplerTypeSpecConstants = options.forceSamplerTypeSpecConstants;
|
forceSamplerTypeSpecConstants = options.forceSamplerTypeSpecConstants;
|
||||||
|
|
||||||
|
vertexConstantBufferAsSSBO = pDevice->GetVertexConstantLayout().totalSize() > devInfo.core.properties.limits.maxUniformBufferRange;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -5,11 +5,12 @@
|
|||||||
|
|
||||||
namespace dxvk {
|
namespace dxvk {
|
||||||
|
|
||||||
|
class D3D9DeviceEx;
|
||||||
struct D3D9Options;
|
struct D3D9Options;
|
||||||
|
|
||||||
struct DxsoOptions {
|
struct DxsoOptions {
|
||||||
DxsoOptions();
|
DxsoOptions();
|
||||||
DxsoOptions(const Rc<DxvkDevice>& device, const D3D9Options& options);
|
DxsoOptions(D3D9DeviceEx* pDevice, const D3D9Options& options);
|
||||||
|
|
||||||
/// Use a SPIR-V extension to implement D3D-style discards
|
/// Use a SPIR-V extension to implement D3D-style discards
|
||||||
bool useDemoteToHelperInvocation = false;
|
bool useDemoteToHelperInvocation = false;
|
||||||
@ -41,6 +42,9 @@ namespace dxvk {
|
|||||||
/// Always use a spec constant to determine sampler type (instead of just in PS 1.x)
|
/// Always use a spec constant to determine sampler type (instead of just in PS 1.x)
|
||||||
/// Works around a game bug in Halo CE where it gives cube textures to 2d/volume samplers
|
/// Works around a game bug in Halo CE where it gives cube textures to 2d/volume samplers
|
||||||
bool forceSamplerTypeSpecConstants;
|
bool forceSamplerTypeSpecConstants;
|
||||||
|
|
||||||
|
/// Should the VS constant buffer be an SSBO (swvp on NV)
|
||||||
|
bool vertexConstantBufferAsSSBO;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user