Created
January 29, 2020 21:18
-
-
Save misyltoad/a3380b359d2f40d169f64dcdd754ece4 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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