Browse Source
Merge pull request #11349 from vonchenplus/buffer_cache_crash
video_core: Fix moltenvk crash on macos
pull/15/merge
liamwhite
2 years ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with
25 additions and
8 deletions
-
src/video_core/buffer_cache/buffer_cache_base.h
-
src/video_core/host_shaders/convert_d24s8_to_abgr8.frag
-
src/video_core/host_shaders/convert_s8d24_to_abgr8.frag
-
src/video_core/renderer_vulkan/vk_rasterizer.cpp
|
|
|
@ -62,7 +62,11 @@ using BufferId = SlotId; |
|
|
|
using VideoCore::Surface::PixelFormat; |
|
|
|
using namespace Common::Literals; |
|
|
|
|
|
|
|
#ifdef __APPLE__ |
|
|
|
constexpr u32 NUM_VERTEX_BUFFERS = 16; |
|
|
|
#else |
|
|
|
constexpr u32 NUM_VERTEX_BUFFERS = 32; |
|
|
|
#endif |
|
|
|
constexpr u32 NUM_TRANSFORM_FEEDBACK_BUFFERS = 4; |
|
|
|
constexpr u32 NUM_GRAPHICS_UNIFORM_BUFFERS = 18; |
|
|
|
constexpr u32 NUM_COMPUTE_UNIFORM_BUFFERS = 8; |
|
|
|
|
|
|
|
@ -3,16 +3,16 @@ |
|
|
|
|
|
|
|
#version 450 |
|
|
|
|
|
|
|
precision mediump int; |
|
|
|
precision highp float; |
|
|
|
|
|
|
|
layout(binding = 0) uniform sampler2D depth_tex; |
|
|
|
layout(binding = 1) uniform isampler2D stencil_tex; |
|
|
|
layout(binding = 1) uniform usampler2D stencil_tex; |
|
|
|
|
|
|
|
layout(location = 0) out vec4 color; |
|
|
|
|
|
|
|
void main() { |
|
|
|
ivec2 coord = ivec2(gl_FragCoord.xy); |
|
|
|
uint depth = uint(textureLod(depth_tex, coord, 0).r * (exp2(24.0) - 1.0f)); |
|
|
|
uint stencil = uint(textureLod(stencil_tex, coord, 0).r); |
|
|
|
|
|
|
|
highp uint depth_val = |
|
|
|
uint(textureLod(depth_tex, coord, 0).r * (exp2(32.0) - 1.0)); |
|
|
|
lowp uint stencil_val = textureLod(stencil_tex, coord, 0).r; |
|
|
|
|
|
|
|
@ -3,16 +3,16 @@ |
|
|
|
|
|
|
|
#version 450 |
|
|
|
|
|
|
|
precision mediump int; |
|
|
|
precision highp float; |
|
|
|
|
|
|
|
layout(binding = 0) uniform sampler2D depth_tex; |
|
|
|
layout(binding = 1) uniform isampler2D stencil_tex; |
|
|
|
layout(binding = 1) uniform usampler2D stencil_tex; |
|
|
|
|
|
|
|
layout(location = 0) out vec4 color; |
|
|
|
|
|
|
|
void main() { |
|
|
|
ivec2 coord = ivec2(gl_FragCoord.xy); |
|
|
|
uint depth = uint(textureLod(depth_tex, coord, 0).r * (exp2(24.0) - 1.0f)); |
|
|
|
uint stencil = uint(textureLod(stencil_tex, coord, 0).r); |
|
|
|
|
|
|
|
highp uint depth_val = |
|
|
|
uint(textureLod(depth_tex, coord, 0).r * (exp2(32.0) - 1.0)); |
|
|
|
lowp uint stencil_val = textureLod(stencil_tex, coord, 0).r; |
|
|
|
|
|
|
|
@ -975,6 +975,19 @@ void RasterizerVulkan::UpdateScissorsState(Tegra::Engines::Maxwell3D::Regs& regs |
|
|
|
if (!state_tracker.TouchScissors()) { |
|
|
|
return; |
|
|
|
} |
|
|
|
if (!regs.viewport_scale_offset_enabled) { |
|
|
|
const auto x = static_cast<float>(regs.surface_clip.x); |
|
|
|
const auto y = static_cast<float>(regs.surface_clip.y); |
|
|
|
const auto width = static_cast<float>(regs.surface_clip.width); |
|
|
|
const auto height = static_cast<float>(regs.surface_clip.height); |
|
|
|
VkRect2D scissor; |
|
|
|
scissor.offset.x = static_cast<u32>(x); |
|
|
|
scissor.offset.y = static_cast<u32>(y); |
|
|
|
scissor.extent.width = static_cast<u32>(width != 0.0f ? width : 1.0f); |
|
|
|
scissor.extent.height = static_cast<u32>(height != 0.0f ? height : 1.0f); |
|
|
|
scheduler.Record([scissor](vk::CommandBuffer cmdbuf) { cmdbuf.SetScissor(0, scissor); }); |
|
|
|
return; |
|
|
|
} |
|
|
|
u32 up_scale = 1; |
|
|
|
u32 down_shift = 0; |
|
|
|
if (texture_cache.IsRescaling()) { |
|
|
|
|