|
|
@ -16,6 +16,7 @@
|
|
|
|
#include "video_core/host_shaders/vulkan_blit_depth_stencil_frag_spv.h"
|
|
|
|
#include "video_core/host_shaders/vulkan_blit_depth_stencil_frag_spv.h"
|
|
|
|
#include "video_core/host_shaders/vulkan_color_clear_frag_spv.h"
|
|
|
|
#include "video_core/host_shaders/vulkan_color_clear_frag_spv.h"
|
|
|
|
#include "video_core/host_shaders/vulkan_color_clear_vert_spv.h"
|
|
|
|
#include "video_core/host_shaders/vulkan_color_clear_vert_spv.h"
|
|
|
|
|
|
|
|
#include "video_core/host_shaders/vulkan_depthstencil_clear_frag_spv.h"
|
|
|
|
#include "video_core/renderer_vulkan/blit_image.h"
|
|
|
|
#include "video_core/renderer_vulkan/blit_image.h"
|
|
|
|
#include "video_core/renderer_vulkan/maxwell_to_vk.h"
|
|
|
|
#include "video_core/renderer_vulkan/maxwell_to_vk.h"
|
|
|
|
#include "video_core/renderer_vulkan/vk_scheduler.h"
|
|
|
|
#include "video_core/renderer_vulkan/vk_scheduler.h"
|
|
|
@ -428,6 +429,7 @@ BlitImageHelper::BlitImageHelper(const Device& device_, Scheduler& scheduler_,
|
|
|
|
blit_depth_stencil_frag(BuildShader(device, VULKAN_BLIT_DEPTH_STENCIL_FRAG_SPV)),
|
|
|
|
blit_depth_stencil_frag(BuildShader(device, VULKAN_BLIT_DEPTH_STENCIL_FRAG_SPV)),
|
|
|
|
clear_color_vert(BuildShader(device, VULKAN_COLOR_CLEAR_VERT_SPV)),
|
|
|
|
clear_color_vert(BuildShader(device, VULKAN_COLOR_CLEAR_VERT_SPV)),
|
|
|
|
clear_color_frag(BuildShader(device, VULKAN_COLOR_CLEAR_FRAG_SPV)),
|
|
|
|
clear_color_frag(BuildShader(device, VULKAN_COLOR_CLEAR_FRAG_SPV)),
|
|
|
|
|
|
|
|
clear_stencil_frag(BuildShader(device, VULKAN_DEPTHSTENCIL_CLEAR_FRAG_SPV)),
|
|
|
|
convert_depth_to_float_frag(BuildShader(device, CONVERT_DEPTH_TO_FLOAT_FRAG_SPV)),
|
|
|
|
convert_depth_to_float_frag(BuildShader(device, CONVERT_DEPTH_TO_FLOAT_FRAG_SPV)),
|
|
|
|
convert_float_to_depth_frag(BuildShader(device, CONVERT_FLOAT_TO_DEPTH_FRAG_SPV)),
|
|
|
|
convert_float_to_depth_frag(BuildShader(device, CONVERT_FLOAT_TO_DEPTH_FRAG_SPV)),
|
|
|
|
convert_abgr8_to_d24s8_frag(BuildShader(device, CONVERT_ABGR8_TO_D24S8_FRAG_SPV)),
|
|
|
|
convert_abgr8_to_d24s8_frag(BuildShader(device, CONVERT_ABGR8_TO_D24S8_FRAG_SPV)),
|
|
|
@ -593,6 +595,28 @@ void BlitImageHelper::ClearColor(const Framebuffer* dst_framebuffer, u8 color_ma
|
|
|
|
scheduler.InvalidateState();
|
|
|
|
scheduler.InvalidateState();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void BlitImageHelper::ClearDepthStencil(const Framebuffer* dst_framebuffer, bool depth_clear,
|
|
|
|
|
|
|
|
f32 clear_depth, u8 stencil_mask, u32 stencil_ref,
|
|
|
|
|
|
|
|
u32 stencil_compare_mask, const Region2D& dst_region) {
|
|
|
|
|
|
|
|
const BlitDepthStencilPipelineKey key{
|
|
|
|
|
|
|
|
.renderpass = dst_framebuffer->RenderPass(),
|
|
|
|
|
|
|
|
.depth_clear = depth_clear,
|
|
|
|
|
|
|
|
.stencil_mask = stencil_mask,
|
|
|
|
|
|
|
|
.stencil_compare_mask = stencil_compare_mask,
|
|
|
|
|
|
|
|
.stencil_ref = stencil_ref,
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
const VkPipeline pipeline = FindOrEmplaceClearStencilPipeline(key);
|
|
|
|
|
|
|
|
const VkPipelineLayout layout = *clear_color_pipeline_layout;
|
|
|
|
|
|
|
|
scheduler.RequestRenderpass(dst_framebuffer);
|
|
|
|
|
|
|
|
scheduler.Record([pipeline, layout, clear_depth, dst_region](vk::CommandBuffer cmdbuf) {
|
|
|
|
|
|
|
|
cmdbuf.BindPipeline(VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
|
|
|
|
|
|
|
|
BindBlitState(cmdbuf, dst_region);
|
|
|
|
|
|
|
|
cmdbuf.PushConstants(layout, VK_SHADER_STAGE_FRAGMENT_BIT, clear_depth);
|
|
|
|
|
|
|
|
cmdbuf.Draw(3, 1, 0, 0);
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
scheduler.InvalidateState();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void BlitImageHelper::Convert(VkPipeline pipeline, const Framebuffer* dst_framebuffer,
|
|
|
|
void BlitImageHelper::Convert(VkPipeline pipeline, const Framebuffer* dst_framebuffer,
|
|
|
|
const ImageView& src_image_view) {
|
|
|
|
const ImageView& src_image_view) {
|
|
|
|
const VkPipelineLayout layout = *one_texture_pipeline_layout;
|
|
|
|
const VkPipelineLayout layout = *one_texture_pipeline_layout;
|
|
|
@ -820,6 +844,61 @@ VkPipeline BlitImageHelper::FindOrEmplaceClearColorPipeline(const BlitImagePipel
|
|
|
|
return *clear_color_pipelines.back();
|
|
|
|
return *clear_color_pipelines.back();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
VkPipeline BlitImageHelper::FindOrEmplaceClearStencilPipeline(
|
|
|
|
|
|
|
|
const BlitDepthStencilPipelineKey& key) {
|
|
|
|
|
|
|
|
const auto it = std::ranges::find(clear_stencil_keys, key);
|
|
|
|
|
|
|
|
if (it != clear_stencil_keys.end()) {
|
|
|
|
|
|
|
|
return *clear_stencil_pipelines[std::distance(clear_stencil_keys.begin(), it)];
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
clear_stencil_keys.push_back(key);
|
|
|
|
|
|
|
|
const std::array stages = MakeStages(*clear_color_vert, *clear_stencil_frag);
|
|
|
|
|
|
|
|
const auto stencil = VkStencilOpState{
|
|
|
|
|
|
|
|
.failOp = VK_STENCIL_OP_KEEP,
|
|
|
|
|
|
|
|
.passOp = VK_STENCIL_OP_REPLACE,
|
|
|
|
|
|
|
|
.depthFailOp = VK_STENCIL_OP_KEEP,
|
|
|
|
|
|
|
|
.compareOp = VK_COMPARE_OP_ALWAYS,
|
|
|
|
|
|
|
|
.compareMask = key.stencil_compare_mask,
|
|
|
|
|
|
|
|
.writeMask = key.stencil_mask,
|
|
|
|
|
|
|
|
.reference = key.stencil_ref,
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
const VkPipelineDepthStencilStateCreateInfo depth_stencil_ci{
|
|
|
|
|
|
|
|
.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO,
|
|
|
|
|
|
|
|
.pNext = nullptr,
|
|
|
|
|
|
|
|
.flags = 0,
|
|
|
|
|
|
|
|
.depthTestEnable = VK_FALSE,
|
|
|
|
|
|
|
|
.depthWriteEnable = key.depth_clear,
|
|
|
|
|
|
|
|
.depthCompareOp = VK_COMPARE_OP_ALWAYS,
|
|
|
|
|
|
|
|
.depthBoundsTestEnable = VK_FALSE,
|
|
|
|
|
|
|
|
.stencilTestEnable = VK_TRUE,
|
|
|
|
|
|
|
|
.front = stencil,
|
|
|
|
|
|
|
|
.back = stencil,
|
|
|
|
|
|
|
|
.minDepthBounds = 0.0f,
|
|
|
|
|
|
|
|
.maxDepthBounds = 0.0f,
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
clear_stencil_pipelines.push_back(device.GetLogical().CreateGraphicsPipeline({
|
|
|
|
|
|
|
|
.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO,
|
|
|
|
|
|
|
|
.pNext = nullptr,
|
|
|
|
|
|
|
|
.flags = 0,
|
|
|
|
|
|
|
|
.stageCount = static_cast<u32>(stages.size()),
|
|
|
|
|
|
|
|
.pStages = stages.data(),
|
|
|
|
|
|
|
|
.pVertexInputState = &PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO,
|
|
|
|
|
|
|
|
.pInputAssemblyState = &PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO,
|
|
|
|
|
|
|
|
.pTessellationState = nullptr,
|
|
|
|
|
|
|
|
.pViewportState = &PIPELINE_VIEWPORT_STATE_CREATE_INFO,
|
|
|
|
|
|
|
|
.pRasterizationState = &PIPELINE_RASTERIZATION_STATE_CREATE_INFO,
|
|
|
|
|
|
|
|
.pMultisampleState = &PIPELINE_MULTISAMPLE_STATE_CREATE_INFO,
|
|
|
|
|
|
|
|
.pDepthStencilState = &depth_stencil_ci,
|
|
|
|
|
|
|
|
.pColorBlendState = &PIPELINE_COLOR_BLEND_STATE_GENERIC_CREATE_INFO,
|
|
|
|
|
|
|
|
.pDynamicState = &PIPELINE_DYNAMIC_STATE_CREATE_INFO,
|
|
|
|
|
|
|
|
.layout = *clear_color_pipeline_layout,
|
|
|
|
|
|
|
|
.renderPass = key.renderpass,
|
|
|
|
|
|
|
|
.subpass = 0,
|
|
|
|
|
|
|
|
.basePipelineHandle = VK_NULL_HANDLE,
|
|
|
|
|
|
|
|
.basePipelineIndex = 0,
|
|
|
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
return *clear_stencil_pipelines.back();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void BlitImageHelper::ConvertPipeline(vk::Pipeline& pipeline, VkRenderPass renderpass,
|
|
|
|
void BlitImageHelper::ConvertPipeline(vk::Pipeline& pipeline, VkRenderPass renderpass,
|
|
|
|
bool is_target_depth) {
|
|
|
|
bool is_target_depth) {
|
|
|
|
if (pipeline) {
|
|
|
|
if (pipeline) {
|
|
|
|