early-access version 2343
This commit is contained in:
parent
e6d4bc36fd
commit
c208875b26
7 changed files with 36 additions and 71 deletions
|
@ -1,7 +1,7 @@
|
||||||
yuzu emulator early access
|
yuzu emulator early access
|
||||||
=============
|
=============
|
||||||
|
|
||||||
This is the source code for early-access 2342.
|
This is the source code for early-access 2343.
|
||||||
|
|
||||||
## Legal Notice
|
## Legal Notice
|
||||||
|
|
||||||
|
|
|
@ -518,53 +518,6 @@ void BlitImageHelper::Convert(VkPipeline pipeline, const Framebuffer* dst_frameb
|
||||||
scheduler.InvalidateState();
|
scheduler.InvalidateState();
|
||||||
}
|
}
|
||||||
|
|
||||||
void BlitImageHelper::ConvertColor(VkPipeline pipeline, const Framebuffer* dst_framebuffer,
|
|
||||||
ImageView& src_image_view, u32 up_scale, u32 down_shift) {
|
|
||||||
const VkPipelineLayout layout = *one_texture_pipeline_layout;
|
|
||||||
const VkImageView src_view = src_image_view.ColorView();
|
|
||||||
const VkSampler sampler = *nearest_sampler;
|
|
||||||
const VkExtent2D extent{
|
|
||||||
.width = std::max((src_image_view.size.width * up_scale) >> down_shift, 1U),
|
|
||||||
.height = std::max((src_image_view.size.height * up_scale) >> down_shift, 1U),
|
|
||||||
};
|
|
||||||
scheduler.RequestRenderpass(dst_framebuffer);
|
|
||||||
scheduler.Record([pipeline, layout, sampler, src_view, extent, up_scale, down_shift,
|
|
||||||
this](vk::CommandBuffer cmdbuf) {
|
|
||||||
const VkOffset2D offset{
|
|
||||||
.x = 0,
|
|
||||||
.y = 0,
|
|
||||||
};
|
|
||||||
const VkViewport viewport{
|
|
||||||
.x = 0.0f,
|
|
||||||
.y = 0.0f,
|
|
||||||
.width = static_cast<float>(extent.width),
|
|
||||||
.height = static_cast<float>(extent.height),
|
|
||||||
.minDepth = 0.0f,
|
|
||||||
.maxDepth = 0.0f,
|
|
||||||
};
|
|
||||||
const VkRect2D scissor{
|
|
||||||
.offset = offset,
|
|
||||||
.extent = extent,
|
|
||||||
};
|
|
||||||
const PushConstants push_constants{
|
|
||||||
.tex_scale = {viewport.width, viewport.height},
|
|
||||||
.tex_offset = {0.0f, 0.0f},
|
|
||||||
};
|
|
||||||
const VkDescriptorSet descriptor_set = one_texture_descriptor_allocator.Commit();
|
|
||||||
UpdateOneTextureDescriptorSet(device, descriptor_set, sampler, src_view);
|
|
||||||
|
|
||||||
// TODO: Barriers
|
|
||||||
cmdbuf.BindPipeline(VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
|
|
||||||
cmdbuf.BindDescriptorSets(VK_PIPELINE_BIND_POINT_GRAPHICS, layout, 0, descriptor_set,
|
|
||||||
nullptr);
|
|
||||||
cmdbuf.SetViewport(0, viewport);
|
|
||||||
cmdbuf.SetScissor(0, scissor);
|
|
||||||
cmdbuf.PushConstants(layout, VK_SHADER_STAGE_VERTEX_BIT, push_constants);
|
|
||||||
cmdbuf.Draw(3, 1, 0, 0);
|
|
||||||
});
|
|
||||||
scheduler.InvalidateState();
|
|
||||||
}
|
|
||||||
|
|
||||||
void BlitImageHelper::ConvertDepthStencil(VkPipeline pipeline, const Framebuffer* dst_framebuffer,
|
void BlitImageHelper::ConvertDepthStencil(VkPipeline pipeline, const Framebuffer* dst_framebuffer,
|
||||||
ImageView& src_image_view) {
|
ImageView& src_image_view) {
|
||||||
const VkPipelineLayout layout = *two_textures_pipeline_layout;
|
const VkPipelineLayout layout = *two_textures_pipeline_layout;
|
||||||
|
|
|
@ -60,9 +60,6 @@ private:
|
||||||
void Convert(VkPipeline pipeline, const Framebuffer* dst_framebuffer,
|
void Convert(VkPipeline pipeline, const Framebuffer* dst_framebuffer,
|
||||||
const ImageView& src_image_view);
|
const ImageView& src_image_view);
|
||||||
|
|
||||||
void ConvertColor(VkPipeline pipeline, const Framebuffer* dst_framebuffer,
|
|
||||||
ImageView& src_image_view, u32 up_scale, u32 down_shift);
|
|
||||||
|
|
||||||
void ConvertDepthStencil(VkPipeline pipeline, const Framebuffer* dst_framebuffer,
|
void ConvertDepthStencil(VkPipeline pipeline, const Framebuffer* dst_framebuffer,
|
||||||
ImageView& src_image_view);
|
ImageView& src_image_view);
|
||||||
|
|
||||||
|
|
|
@ -1344,7 +1344,6 @@ bool Image::ScaleUp(bool ignore) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
has_scaled = true;
|
has_scaled = true;
|
||||||
const auto& device = runtime->device;
|
|
||||||
if (!scaled_image) {
|
if (!scaled_image) {
|
||||||
const bool is_2d = info.type == ImageType::e2D;
|
const bool is_2d = info.type == ImageType::e2D;
|
||||||
const u32 scaled_width = resolution.ScaleUp(info.size.width);
|
const u32 scaled_width = resolution.ScaleUp(info.size.width);
|
||||||
|
@ -1352,7 +1351,7 @@ bool Image::ScaleUp(bool ignore) {
|
||||||
auto scaled_info = info;
|
auto scaled_info = info;
|
||||||
scaled_info.size.width = scaled_width;
|
scaled_info.size.width = scaled_width;
|
||||||
scaled_info.size.height = scaled_height;
|
scaled_info.size.height = scaled_height;
|
||||||
scaled_image = MakeImage(device, scaled_info);
|
scaled_image = MakeImage(runtime->device, scaled_info);
|
||||||
auto& allocator = runtime->memory_allocator;
|
auto& allocator = runtime->memory_allocator;
|
||||||
scaled_commit = MemoryCommit(allocator.Commit(scaled_image, MemoryUsage::DeviceLocal));
|
scaled_commit = MemoryCommit(allocator.Commit(scaled_image, MemoryUsage::DeviceLocal));
|
||||||
ignore = false;
|
ignore = false;
|
||||||
|
@ -1361,18 +1360,13 @@ bool Image::ScaleUp(bool ignore) {
|
||||||
if (ignore) {
|
if (ignore) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (aspect_mask == 0) {
|
if (aspect_mask == 0) {
|
||||||
aspect_mask = ImageAspectMask(info.format);
|
aspect_mask = ImageAspectMask(info.format);
|
||||||
}
|
}
|
||||||
static constexpr auto OPTIMAL_FORMAT = FormatType::Optimal;
|
if (NeedsScaleHelper()) {
|
||||||
const PixelFormat format = StorageFormat(info.format);
|
|
||||||
const auto vk_format = MaxwellToVK::SurfaceFormat(device, OPTIMAL_FORMAT, false, format).format;
|
|
||||||
const auto blit_usage = VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT;
|
|
||||||
if (device.IsFormatSupported(vk_format, blit_usage, OPTIMAL_FORMAT)) {
|
|
||||||
BlitScale(*scheduler, *original_image, *scaled_image, info, aspect_mask, resolution);
|
|
||||||
} else {
|
|
||||||
return BlitScaleHelper(true);
|
return BlitScaleHelper(true);
|
||||||
|
} else {
|
||||||
|
BlitScale(*scheduler, *original_image, *scaled_image, info, aspect_mask, resolution);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -1394,15 +1388,10 @@ bool Image::ScaleDown(bool ignore) {
|
||||||
if (aspect_mask == 0) {
|
if (aspect_mask == 0) {
|
||||||
aspect_mask = ImageAspectMask(info.format);
|
aspect_mask = ImageAspectMask(info.format);
|
||||||
}
|
}
|
||||||
static constexpr auto OPTIMAL_FORMAT = FormatType::Optimal;
|
if (NeedsScaleHelper()) {
|
||||||
const PixelFormat format = StorageFormat(info.format);
|
|
||||||
const auto& device = runtime->device;
|
|
||||||
const auto vk_format = MaxwellToVK::SurfaceFormat(device, OPTIMAL_FORMAT, false, format).format;
|
|
||||||
const auto blit_usage = VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT;
|
|
||||||
if (device.IsFormatSupported(vk_format, blit_usage, OPTIMAL_FORMAT)) {
|
|
||||||
BlitScale(*scheduler, *scaled_image, *original_image, info, aspect_mask, resolution, false);
|
|
||||||
} else {
|
|
||||||
return BlitScaleHelper(false);
|
return BlitScaleHelper(false);
|
||||||
|
} else {
|
||||||
|
BlitScale(*scheduler, *scaled_image, *original_image, info, aspect_mask, resolution, false);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -1470,6 +1459,20 @@ bool Image::BlitScaleHelper(bool scale_up) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Image::NeedsScaleHelper() const {
|
||||||
|
const auto& device = runtime->device;
|
||||||
|
const bool needs_msaa_helper = info.num_samples > 1 && device.CantBlitMSAA();
|
||||||
|
if (needs_msaa_helper) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
static constexpr auto OPTIMAL_FORMAT = FormatType::Optimal;
|
||||||
|
const PixelFormat format = StorageFormat(info.format);
|
||||||
|
const auto vk_format = MaxwellToVK::SurfaceFormat(device, OPTIMAL_FORMAT, false, format).format;
|
||||||
|
const auto blit_usage = VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT;
|
||||||
|
const bool needs_blit_helper = !device.IsFormatSupported(vk_format, blit_usage, OPTIMAL_FORMAT);
|
||||||
|
return needs_blit_helper;
|
||||||
|
}
|
||||||
|
|
||||||
ImageView::ImageView(TextureCacheRuntime& runtime, const VideoCommon::ImageViewInfo& info,
|
ImageView::ImageView(TextureCacheRuntime& runtime, const VideoCommon::ImageViewInfo& info,
|
||||||
ImageId image_id_, Image& image)
|
ImageId image_id_, Image& image)
|
||||||
: VideoCommon::ImageViewBase{info, image.info, image_id_}, device{&runtime.device},
|
: VideoCommon::ImageViewBase{info, image.info, image_id_}, device{&runtime.device},
|
||||||
|
|
|
@ -149,6 +149,8 @@ public:
|
||||||
private:
|
private:
|
||||||
bool BlitScaleHelper(bool scale_up);
|
bool BlitScaleHelper(bool scale_up);
|
||||||
|
|
||||||
|
bool NeedsScaleHelper() const;
|
||||||
|
|
||||||
VKScheduler* scheduler{};
|
VKScheduler* scheduler{};
|
||||||
TextureCacheRuntime* runtime{};
|
TextureCacheRuntime* runtime{};
|
||||||
|
|
||||||
|
|
|
@ -638,15 +638,20 @@ Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ext_vertex_input_dynamic_state && driver_id == VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS) {
|
const bool is_intel_windows = driver_id == VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS;
|
||||||
|
if (ext_vertex_input_dynamic_state && is_intel_windows) {
|
||||||
LOG_WARNING(Render_Vulkan, "Blacklisting Intel for VK_EXT_vertex_input_dynamic_state");
|
LOG_WARNING(Render_Vulkan, "Blacklisting Intel for VK_EXT_vertex_input_dynamic_state");
|
||||||
ext_vertex_input_dynamic_state = false;
|
ext_vertex_input_dynamic_state = false;
|
||||||
}
|
}
|
||||||
if (is_float16_supported && driver_id == VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS) {
|
if (is_float16_supported && is_intel_windows) {
|
||||||
// Intel's compiler crashes when using fp16 on Astral Chain, disable it for the time being.
|
// Intel's compiler crashes when using fp16 on Astral Chain, disable it for the time being.
|
||||||
LOG_WARNING(Render_Vulkan, "Blacklisting Intel proprietary from float16 math");
|
LOG_WARNING(Render_Vulkan, "Blacklisting Intel proprietary from float16 math");
|
||||||
is_float16_supported = false;
|
is_float16_supported = false;
|
||||||
}
|
}
|
||||||
|
if (is_intel_windows) {
|
||||||
|
LOG_WARNING(Render_Vulkan, "Intel proprietary drivers do not support MSAA image blits");
|
||||||
|
cant_blit_msaa = true;
|
||||||
|
}
|
||||||
|
|
||||||
supports_d24_depth =
|
supports_d24_depth =
|
||||||
IsFormatSupported(VK_FORMAT_D24_UNORM_S8_UINT,
|
IsFormatSupported(VK_FORMAT_D24_UNORM_S8_UINT,
|
||||||
|
|
|
@ -350,6 +350,10 @@ public:
|
||||||
return supports_d24_depth;
|
return supports_d24_depth;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CantBlitMSAA() const {
|
||||||
|
return cant_blit_msaa;
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/// Checks if the physical device is suitable.
|
/// Checks if the physical device is suitable.
|
||||||
void CheckSuitability(bool requires_swapchain) const;
|
void CheckSuitability(bool requires_swapchain) const;
|
||||||
|
@ -443,6 +447,7 @@ private:
|
||||||
bool has_renderdoc{}; ///< Has RenderDoc attached
|
bool has_renderdoc{}; ///< Has RenderDoc attached
|
||||||
bool has_nsight_graphics{}; ///< Has Nsight Graphics attached
|
bool has_nsight_graphics{}; ///< Has Nsight Graphics attached
|
||||||
bool supports_d24_depth{}; ///< Supports D24 depth buffers.
|
bool supports_d24_depth{}; ///< Supports D24 depth buffers.
|
||||||
|
bool cant_blit_msaa{}; ///< Does not support MSAA<->MSAA blitting.
|
||||||
|
|
||||||
// Telemetry parameters
|
// Telemetry parameters
|
||||||
std::string vendor_name; ///< Device's driver name.
|
std::string vendor_name; ///< Device's driver name.
|
||||||
|
|
Loading…
Reference in a new issue