Browse Source
Merge pull request #10402 from liamwhite/uh
renderer_vulkan: barrier attachment feedback loops
pull/15/merge
liamwhite
3 years ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with
51 additions and
1 deletions
-
src/video_core/renderer_opengl/gl_texture_cache.h
-
src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp
-
src/video_core/renderer_vulkan/vk_texture_cache.cpp
-
src/video_core/renderer_vulkan/vk_texture_cache.h
-
src/video_core/texture_cache/texture_cache.h
-
src/video_core/texture_cache/texture_cache_base.h
|
|
|
@ -144,6 +144,10 @@ public: |
|
|
|
return state_tracker; |
|
|
|
} |
|
|
|
|
|
|
|
void BarrierFeedbackLoop() const noexcept { |
|
|
|
// OpenGL does not require a barrier for attachment feedback loops. |
|
|
|
} |
|
|
|
|
|
|
|
private: |
|
|
|
struct StagingBuffers { |
|
|
|
explicit StagingBuffers(GLenum storage_flags_, GLenum map_flags_); |
|
|
|
|
|
|
|
@ -481,12 +481,13 @@ void GraphicsPipeline::ConfigureImpl(bool is_indexed) { |
|
|
|
if constexpr (Spec::enabled_stages[4]) { |
|
|
|
prepare_stage(4); |
|
|
|
} |
|
|
|
texture_cache.UpdateRenderTargets(false); |
|
|
|
texture_cache.CheckFeedbackLoop(views); |
|
|
|
ConfigureDraw(rescaling, render_area); |
|
|
|
} |
|
|
|
|
|
|
|
void GraphicsPipeline::ConfigureDraw(const RescalingPushConstant& rescaling, |
|
|
|
const RenderAreaPushConstant& render_area) { |
|
|
|
texture_cache.UpdateRenderTargets(false); |
|
|
|
scheduler.RequestRenderpass(texture_cache.GetFramebuffer()); |
|
|
|
|
|
|
|
if (!is_built.load(std::memory_order::relaxed)) { |
|
|
|
|
|
|
|
@ -861,6 +861,10 @@ VkBuffer TextureCacheRuntime::GetTemporaryBuffer(size_t needed_size) { |
|
|
|
return *buffers[level]; |
|
|
|
} |
|
|
|
|
|
|
|
void TextureCacheRuntime::BarrierFeedbackLoop() { |
|
|
|
scheduler.RequestOutsideRenderPassOperationContext(); |
|
|
|
} |
|
|
|
|
|
|
|
void TextureCacheRuntime::ReinterpretImage(Image& dst, Image& src, |
|
|
|
std::span<const VideoCommon::ImageCopy> copies) { |
|
|
|
std::vector<VkBufferImageCopy> vk_in_copies(copies.size()); |
|
|
|
|
|
|
|
@ -103,6 +103,8 @@ public: |
|
|
|
|
|
|
|
[[nodiscard]] VkBuffer GetTemporaryBuffer(size_t needed_size); |
|
|
|
|
|
|
|
void BarrierFeedbackLoop(); |
|
|
|
|
|
|
|
const Device& device; |
|
|
|
Scheduler& scheduler; |
|
|
|
MemoryAllocator& memory_allocator; |
|
|
|
|
|
|
|
@ -183,6 +183,42 @@ void TextureCache<P>::FillComputeImageViews(std::span<ImageViewInOut> views) { |
|
|
|
views); |
|
|
|
} |
|
|
|
|
|
|
|
template <class P> |
|
|
|
void TextureCache<P>::CheckFeedbackLoop(std::span<const ImageViewInOut> views) { |
|
|
|
const bool requires_barrier = [&] { |
|
|
|
for (const auto& view : views) { |
|
|
|
if (!view.id) { |
|
|
|
continue; |
|
|
|
} |
|
|
|
auto& image_view = slot_image_views[view.id]; |
|
|
|
|
|
|
|
// Check color targets |
|
|
|
for (const auto& ct_view_id : render_targets.color_buffer_ids) { |
|
|
|
if (ct_view_id) { |
|
|
|
auto& ct_view = slot_image_views[ct_view_id]; |
|
|
|
if (image_view.image_id == ct_view.image_id) { |
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// Check zeta target |
|
|
|
if (render_targets.depth_buffer_id) { |
|
|
|
auto& zt_view = slot_image_views[render_targets.depth_buffer_id]; |
|
|
|
if (image_view.image_id == zt_view.image_id) { |
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return false; |
|
|
|
}(); |
|
|
|
|
|
|
|
if (requires_barrier) { |
|
|
|
runtime.BarrierFeedbackLoop(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
template <class P> |
|
|
|
typename P::Sampler* TextureCache<P>::GetGraphicsSampler(u32 index) { |
|
|
|
if (index > channel_state->graphics_sampler_table.Limit()) { |
|
|
|
|
|
|
|
@ -148,6 +148,9 @@ public: |
|
|
|
/// Fill image_view_ids with the compute images in indices |
|
|
|
void FillComputeImageViews(std::span<ImageViewInOut> views); |
|
|
|
|
|
|
|
/// Handle feedback loops during draws. |
|
|
|
void CheckFeedbackLoop(std::span<const ImageViewInOut> views); |
|
|
|
|
|
|
|
/// Get the sampler from the graphics descriptor table in the specified index |
|
|
|
Sampler* GetGraphicsSampler(u32 index); |
|
|
|
|
|
|
|
|