mirror of
https://github.com/doitsujin/dxvk.git
synced 2024-12-12 22:08:59 +01:00
[d3d11] Track highest bound constant buffer
This commit is contained in:
parent
18c4ca8e92
commit
5dd2b20940
@ -1,3 +1,5 @@
|
|||||||
|
#include <algorithm>
|
||||||
|
|
||||||
#include "d3d11_context.h"
|
#include "d3d11_context.h"
|
||||||
#include "d3d11_context_def.h"
|
#include "d3d11_context_def.h"
|
||||||
#include "d3d11_context_imm.h"
|
#include "d3d11_context_imm.h"
|
||||||
@ -3781,7 +3783,9 @@ namespace dxvk {
|
|||||||
D3D11MaxUsedBindings result;
|
D3D11MaxUsedBindings result;
|
||||||
|
|
||||||
for (uint32_t i = 0; i < result.stages.size(); i++) {
|
for (uint32_t i = 0; i < result.stages.size(); i++) {
|
||||||
result.stages[i].cbvCount = D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT;
|
auto stage = DxbcProgramType(i);
|
||||||
|
|
||||||
|
result.stages[i].cbvCount = m_state.cbv[stage].maxCount;
|
||||||
result.stages[i].srvCount = D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT;
|
result.stages[i].srvCount = D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT;
|
||||||
result.stages[i].uavCount = 0;
|
result.stages[i].uavCount = 0;
|
||||||
result.stages[i].samplerCount = D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT;
|
result.stages[i].samplerCount = D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT;
|
||||||
@ -4108,7 +4112,7 @@ namespace dxvk {
|
|||||||
const auto& bindings = m_state.cbv[Stage];
|
const auto& bindings = m_state.cbv[Stage];
|
||||||
uint32_t slotId = computeConstantBufferBinding(Stage, 0);
|
uint32_t slotId = computeConstantBufferBinding(Stage, 0);
|
||||||
|
|
||||||
for (uint32_t i = 0; i < bindings.buffers.size(); i++) {
|
for (uint32_t i = 0; i < bindings.maxCount; i++) {
|
||||||
BindConstantBuffer<Stage>(slotId + i, bindings.buffers[i].buffer.ptr(),
|
BindConstantBuffer<Stage>(slotId + i, bindings.buffers[i].buffer.ptr(),
|
||||||
bindings.buffers[i].constantOffset, bindings.buffers[i].constantBound);
|
bindings.buffers[i].constantOffset, bindings.buffers[i].constantBound);
|
||||||
}
|
}
|
||||||
@ -4182,6 +4186,9 @@ namespace dxvk {
|
|||||||
BindConstantBuffer<ShaderStage>(slotId + i, newBuffer, 0, constantCount);
|
BindConstantBuffer<ShaderStage>(slotId + i, newBuffer, 0, constantCount);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bindings.maxCount = std::clamp(StartSlot + NumBuffers,
|
||||||
|
bindings.maxCount, uint32_t(bindings.buffers.size()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -4254,6 +4261,9 @@ namespace dxvk {
|
|||||||
BindConstantBufferRange<ShaderStage>(slotId + i, constantOffset, constantBound);
|
BindConstantBufferRange<ShaderStage>(slotId + i, constantOffset, constantBound);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bindings.maxCount = std::clamp(StartSlot + NumBuffers,
|
||||||
|
bindings.maxCount, uint32_t(bindings.buffers.size()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -60,9 +60,13 @@ namespace dxvk {
|
|||||||
struct D3D11ShaderStageCbvBinding {
|
struct D3D11ShaderStageCbvBinding {
|
||||||
std::array<D3D11ConstantBufferBinding, D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT> buffers = { };
|
std::array<D3D11ConstantBufferBinding, D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT> buffers = { };
|
||||||
|
|
||||||
|
uint32_t maxCount = 0;
|
||||||
|
|
||||||
void reset() {
|
void reset() {
|
||||||
for (uint32_t i = 0; i < buffers.size(); i++)
|
for (uint32_t i = 0; i < maxCount; i++)
|
||||||
buffers[i] = D3D11ConstantBufferBinding();
|
buffers[i] = D3D11ConstantBufferBinding();
|
||||||
|
|
||||||
|
maxCount = 0;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user