summaryrefslogtreecommitdiff
path: root/Source/Core/VideoBackends/Vulkan/StateTracker.cpp
diff options
context:
space:
mode:
authorAdmiral H. Curtiss <pikachu025@gmail.com>2023-07-01 17:47:55 +0200
committerGitHub <noreply@github.com>2023-07-01 17:47:55 +0200
commiteedc1144c1c06487d83d19a21341b4b9e9ff0e71 (patch)
tree20a558c5dcbc3d4127a036b530d6c2c1dce5aa71 /Source/Core/VideoBackends/Vulkan/StateTracker.cpp
parent179d82385249c5ed338b3ebed159f78fdd5a6b8a (diff)
parent3627398cf53056341701f8e9d846d14c92c77a16 (diff)
Merge pull request #11923 from iwubcode/multi-texture-compute-support
VideoBackends: support multiple compute images for some backends
Diffstat (limited to 'Source/Core/VideoBackends/Vulkan/StateTracker.cpp')
-rw-r--r--Source/Core/VideoBackends/Vulkan/StateTracker.cpp46
1 files changed, 33 insertions, 13 deletions
diff --git a/Source/Core/VideoBackends/Vulkan/StateTracker.cpp b/Source/Core/VideoBackends/Vulkan/StateTracker.cpp
index edf57ae3b1..d6e4e3c422 100644
--- a/Source/Core/VideoBackends/Vulkan/StateTracker.cpp
+++ b/Source/Core/VideoBackends/Vulkan/StateTracker.cpp
@@ -49,8 +49,10 @@ void StateTracker::DestroyInstance()
// Clear everything out so this doesn't happen.
for (auto& it : s_state_tracker->m_bindings.samplers)
it.imageView = VK_NULL_HANDLE;
- s_state_tracker->m_bindings.image_texture.imageView = VK_NULL_HANDLE;
+ for (auto& it : s_state_tracker->m_bindings.image_textures)
+ it.imageView = VK_NULL_HANDLE;
s_state_tracker->m_dummy_texture.reset();
+ s_state_tracker->m_dummy_compute_texture.reset();
s_state_tracker.reset();
}
@@ -64,6 +66,14 @@ bool StateTracker::Initialize()
return false;
m_dummy_texture->TransitionToLayout(g_command_buffer_mgr->GetCurrentInitCommandBuffer(),
VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
+ // Create a dummy compute texture which can be used in place of a real binding
+ m_dummy_compute_texture = VKTexture::Create(
+ TextureConfig(1, 1, 1, 1, 1, AbstractTextureFormat::RGBA8, AbstractTextureFlag_ComputeImage),
+ "");
+ if (!m_dummy_compute_texture)
+ return false;
+ m_dummy_compute_texture->TransitionToLayout(g_command_buffer_mgr->GetCurrentInitCommandBuffer(),
+ VK_IMAGE_LAYOUT_GENERAL);
// Initialize all samplers to point by default
for (size_t i = 0; i < VideoCommon::MAX_PIXEL_SHADER_SAMPLERS; i++)
@@ -73,6 +83,13 @@ bool StateTracker::Initialize()
m_bindings.samplers[i].sampler = g_object_cache->GetPointSampler();
}
+ for (size_t i = 0; i < VideoCommon::MAX_COMPUTE_SHADER_SAMPLERS; i++)
+ {
+ m_bindings.image_textures[i].imageLayout = VK_IMAGE_LAYOUT_GENERAL;
+ m_bindings.image_textures[i].imageView = m_dummy_compute_texture->GetView();
+ m_bindings.image_textures[i].sampler = g_object_cache->GetPointSampler();
+ }
+
// Default dirty flags include all descriptors
InvalidateCachedState();
return true;
@@ -217,13 +234,13 @@ void StateTracker::SetTexelBuffer(u32 index, VkBufferView view)
m_dirty_flags |= DIRTY_FLAG_UTILITY_BINDINGS | DIRTY_FLAG_COMPUTE_BINDINGS;
}
-void StateTracker::SetImageTexture(VkImageView view)
+void StateTracker::SetImageTexture(u32 index, VkImageView view)
{
- if (m_bindings.image_texture.imageView == view)
+ if (m_bindings.image_textures[index].imageView == view)
return;
- m_bindings.image_texture.imageView = view;
- m_bindings.image_texture.imageLayout = VK_IMAGE_LAYOUT_GENERAL;
+ m_bindings.image_textures[index].imageView = view;
+ m_bindings.image_textures[index].imageLayout = VK_IMAGE_LAYOUT_GENERAL;
m_dirty_flags |= DIRTY_FLAG_COMPUTE_BINDINGS;
}
@@ -238,10 +255,13 @@ void StateTracker::UnbindTexture(VkImageView view)
}
}
- if (m_bindings.image_texture.imageView == view)
+ for (VkDescriptorImageInfo& it : m_bindings.image_textures)
{
- m_bindings.image_texture.imageView = m_dummy_texture->GetView();
- m_bindings.image_texture.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
+ if (it.imageView == view)
+ {
+ it.imageView = m_dummy_compute_texture->GetView();
+ it.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
+ }
}
}
@@ -667,7 +687,7 @@ void StateTracker::UpdateComputeDescriptorSet()
m_compute_descriptor_set,
1,
0,
- NUM_COMPUTE_SHADER_SAMPLERS,
+ VideoCommon::MAX_COMPUTE_SHADER_SAMPLERS,
VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
m_bindings.samplers.data(),
nullptr,
@@ -675,7 +695,7 @@ void StateTracker::UpdateComputeDescriptorSet()
dswrites[2] = {VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
nullptr,
m_compute_descriptor_set,
- 3,
+ 1 + VideoCommon::MAX_COMPUTE_SHADER_SAMPLERS,
0,
NUM_COMPUTE_TEXEL_BUFFERS,
VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER,
@@ -685,11 +705,11 @@ void StateTracker::UpdateComputeDescriptorSet()
dswrites[3] = {VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
nullptr,
m_compute_descriptor_set,
- 5,
+ 1 + VideoCommon::MAX_COMPUTE_SHADER_SAMPLERS + NUM_COMPUTE_TEXEL_BUFFERS,
0,
- 1,
+ VideoCommon::MAX_COMPUTE_SHADER_SAMPLERS,
VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
- &m_bindings.image_texture,
+ m_bindings.image_textures.data(),
nullptr,
nullptr};