Skip to content

Instantly share code, notes, and snippets.

@Joshua-Ashton
Created January 29, 2020 21:18
Show Gist options
  • Save Joshua-Ashton/785ec71d2c039bffca048291df15fae7 to your computer and use it in GitHub Desktop.
Save Joshua-Ashton/785ec71d2c039bffca048291df15fae7 to your computer and use it in GitHub Desktop.
diff --git a/src/d3d9/d3d9_device.cpp b/src/d3d9/d3d9_device.cpp
index e29d7d07..a2ff403e 100644
--- a/src/d3d9/d3d9_device.cpp
+++ b/src/d3d9/d3d9_device.cpp
@@ -2441,6 +2441,8 @@ namespace dxvk {
ApplyPrimitiveType(ctx, D3DPT_POINTLIST);
+ Rc<DxvkShader> fragmentShader = ctx->unbindShader(VK_SHADER_STAGE_FRAGMENT_BIT);
+
ctx->bindShader(VK_SHADER_STAGE_GEOMETRY_BIT, shader);
ctx->bindResourceBuffer(getSWVPBufferSlot(), cBufferSlice);
ctx->draw(
@@ -2448,6 +2450,7 @@ namespace dxvk {
cStartIndex, 0);
ctx->bindResourceBuffer(getSWVPBufferSlot(), DxvkBufferSlice());
ctx->bindShader(VK_SHADER_STAGE_GEOMETRY_BIT, nullptr);
+ ctx->bindShader(VK_SHADER_STAGE_FRAGMENT_BIT, fragmentShader);
});
if (dst->GetMapMode() == D3D9_COMMON_BUFFER_MAP_MODE_BUFFER) {
diff --git a/src/dxvk/dxvk_context.cpp b/src/dxvk/dxvk_context.cpp
index 86829a4a..530a10c9 100644
--- a/src/dxvk/dxvk_context.cpp
+++ b/src/dxvk/dxvk_context.cpp
@@ -2383,6 +2383,31 @@ namespace dxvk {
void DxvkContext::trimStagingBuffers() {
m_staging.trim();
}
+
+
+ Rc<DxvkShader> DxvkContext::unbindShader(VkShaderStageFlagBits stage) {
+ if (stage == VK_SHADER_STAGE_COMPUTE_BIT) {
+ m_flags.set(
+ DxvkContextFlag::CpDirtyPipeline,
+ DxvkContextFlag::CpDirtyPipelineState,
+ DxvkContextFlag::CpDirtyResources);
+ } else {
+ m_flags.set(
+ DxvkContextFlag::GpDirtyPipeline,
+ DxvkContextFlag::GpDirtyPipelineState,
+ DxvkContextFlag::GpDirtyResources);
+ }
+
+ switch (stage) {
+ case VK_SHADER_STAGE_VERTEX_BIT: return std::exchange(m_state.gp.shaders.vs, nullptr);
+ case VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT: return std::exchange(m_state.gp.shaders.tcs, nullptr);
+ case VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT: return std::exchange(m_state.gp.shaders.tes, nullptr);
+ case VK_SHADER_STAGE_GEOMETRY_BIT: return std::exchange(m_state.gp.shaders.gs, nullptr);
+ case VK_SHADER_STAGE_FRAGMENT_BIT: return std::exchange(m_state.gp.shaders.fs, nullptr);
+ case VK_SHADER_STAGE_COMPUTE_BIT: return std::exchange(m_state.cp.shaders.cs, nullptr);
+ default: return nullptr;
+ }
+ }
void DxvkContext::blitImageFb(
diff --git a/src/dxvk/dxvk_context.h b/src/dxvk/dxvk_context.h
index 2456b20a..c6aaea6a 100644
--- a/src/dxvk/dxvk_context.h
+++ b/src/dxvk/dxvk_context.h
@@ -1006,6 +1006,14 @@ namespace dxvk {
* given context are rare.
*/
void trimStagingBuffers();
+
+ /**
+ * \brief Unbinds and gets the currently bound shader
+ *
+ * \param [in] stage Target shader stage
+ */
+ Rc<DxvkShader> unbindShader(
+ VkShaderStageFlagBits stage);
private:
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment