Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/doitsujin/dxvk.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoshua Ashton <joshua@froggi.es>2020-02-18 21:28:06 +0300
committerJoshua Ashton <joshua@froggi.es>2020-02-19 00:53:50 +0300
commitef66c2f847526c0b82778947a0423fd8bba4ff36 (patch)
tree4597e9a51fec748cafb7e4e2cae9c08b8d88218f
parentf73dc8fa89f08c4c68f9d052206edf1d3d1c18c1 (diff)
[dxso] Use SSBOs for vertex constant buffers if we'd be outside of uniform ranged3d9-ssbo-swvp
Impacts #1375
-rw-r--r--src/d3d9/d3d9_device.cpp9
-rw-r--r--src/d3d9/d3d9_device.h2
-rw-r--r--src/dxso/dxso_compiler.cpp14
-rw-r--r--src/dxso/dxso_options.cpp8
-rw-r--r--src/dxso/dxso_options.h6
5 files changed, 30 insertions, 9 deletions
diff --git a/src/d3d9/d3d9_device.cpp b/src/d3d9/d3d9_device.cpp
index 78599b91..21279e32 100644
--- a/src/d3d9/d3d9_device.cpp
+++ b/src/d3d9/d3d9_device.cpp
@@ -49,7 +49,6 @@ namespace dxvk {
, m_multithread ( BehaviorFlags & D3DCREATE_MULTITHREADED )
, m_shaderModules ( new D3D9ShaderModuleSet )
, m_d3d9Options ( dxvkDevice, pParent->GetInstance()->config() )
- , m_dxsoOptions ( m_dxvkDevice, m_d3d9Options )
, m_isSWVP ( (BehaviorFlags & D3DCREATE_SOFTWARE_VERTEXPROCESSING) ? TRUE : FALSE ) {
// If we can SWVP, then we use an extended constant set
// as SWVP has many more slots available than HWVP.
@@ -73,11 +72,13 @@ namespace dxvk {
ctx->setLogicOpState(loState);
});
- CreateConstantBuffers();
-
if (!(BehaviorFlags & D3DCREATE_FPU_PRESERVE))
SetupFPU();
+ m_dxsoOptions = DxsoOptions(this, m_d3d9Options);
+
+ CreateConstantBuffers();
+
m_availableMemory = DetermineInitialTextureMemory();
}
@@ -4468,7 +4469,7 @@ namespace dxvk {
void D3D9DeviceEx::CreateConstantBuffers() {
m_consts[DxsoProgramTypes::VertexShader].buffer =
- CreateConstantBuffer(false,
+ CreateConstantBuffer(m_dxsoOptions.vertexConstantBufferAsSSBO,
m_vsLayout.totalSize(),
DxsoProgramType::VertexShader,
DxsoConstantBuffers::VSConstantBuffer);
diff --git a/src/d3d9/d3d9_device.h b/src/d3d9/d3d9_device.h
index c79bbcca..3b0d3e7c 100644
--- a/src/d3d9/d3d9_device.h
+++ b/src/d3d9/d3d9_device.h
@@ -992,7 +992,7 @@ namespace dxvk {
D3D9UPBufferSlice m_upBuffer;
const D3D9Options m_d3d9Options;
- const DxsoOptions m_dxsoOptions;
+ DxsoOptions m_dxsoOptions;
BOOL m_isSWVP;
diff --git a/src/dxso/dxso_compiler.cpp b/src/dxso/dxso_compiler.cpp
index d887b981..134de1c3 100644
--- a/src/dxso/dxso_compiler.cpp
+++ b/src/dxso/dxso_compiler.cpp
@@ -274,6 +274,9 @@ namespace dxvk {
void DxsoCompiler::emitDclConstantBuffer() {
+ const bool asSsbo = m_moduleInfo.options.vertexConstantBufferAsSSBO &&
+ m_programInfo.type() == DxsoProgramType::VertexShader;
+
std::array<uint32_t, 3> members = {
// float f[256 or 224 or 8192]
m_module.defArrayTypeUnique(
@@ -309,7 +312,9 @@ namespace dxvk {
const uint32_t structType =
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, 1, m_layout->intOffset());
@@ -337,9 +342,14 @@ namespace dxvk {
m_module.decorateDescriptorSet(m_cBuffer, 0);
m_module.decorateBinding(m_cBuffer, bindingId);
+ if (asSsbo)
+ m_module.decorate(m_cBuffer, spv::DecorationNonWritable);
+
DxvkResourceSlot resource;
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.access = VK_ACCESS_UNIFORM_READ_BIT;
m_resourceSlots.push_back(resource);
diff --git a/src/dxso/dxso_options.cpp b/src/dxso/dxso_options.cpp
index ef402b0c..41d5fb4c 100644
--- a/src/dxso/dxso_options.cpp
+++ b/src/dxso/dxso_options.cpp
@@ -1,10 +1,14 @@
#include "dxso_options.h"
+#include "../d3d9/d3d9_device.h"
+
namespace dxvk {
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 DxvkDeviceFeatures& devFeatures = device->features();
@@ -39,6 +43,8 @@ namespace dxvk {
invariantPosition = options.invariantPosition;
forceSamplerTypeSpecConstants = options.forceSamplerTypeSpecConstants;
+
+ vertexConstantBufferAsSSBO = pDevice->GetVertexConstantLayout().totalSize() > devInfo.core.properties.limits.maxUniformBufferRange;
}
} \ No newline at end of file
diff --git a/src/dxso/dxso_options.h b/src/dxso/dxso_options.h
index 5a8e5c56..efc87719 100644
--- a/src/dxso/dxso_options.h
+++ b/src/dxso/dxso_options.h
@@ -5,11 +5,12 @@
namespace dxvk {
+ class D3D9DeviceEx;
struct D3D9Options;
struct 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
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)
/// Works around a game bug in Halo CE where it gives cube textures to 2d/volume samplers
bool forceSamplerTypeSpecConstants;
+
+ /// Should the VS constant buffer be an SSBO (swvp on NV)
+ bool vertexConstantBufferAsSSBO;
};
} \ No newline at end of file