Skip to content

Commit 3b2c70c

Browse files
committed
GPUDevice: Get rid of framebuffer abstraction
1 parent a9ee2a3 commit 3b2c70c

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+1376
-1137
lines changed

src/core/core.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
<PreprocessorDefinitions Condition="('$(Platform)'=='x64' Or '$(Platform)'=='ARM64')">ENABLE_MMAP_FASTMEM=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
1111
<PreprocessorDefinitions Condition="('$(Platform)'=='x64' Or '$(Platform)'=='ARM64')">ENABLE_NEWREC=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
1212

13-
<AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(SolutionDir)dep\xxhash\include;$(SolutionDir)dep\zlib\include;$(SolutionDir)dep\rcheevos\include;$(SolutionDir)dep\rapidjson\include;$(SolutionDir)dep\discord-rpc\include</AdditionalIncludeDirectories>
13+
<AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$(SolutionDir)dep\zlib\include;$(SolutionDir)dep\rcheevos\include;$(SolutionDir)dep\rapidjson\include;$(SolutionDir)dep\discord-rpc\include</AdditionalIncludeDirectories>
1414
<AdditionalIncludeDirectories Condition="'$(Platform)'!='ARM64'">%(AdditionalIncludeDirectories);$(SolutionDir)dep\rainterface</AdditionalIncludeDirectories>
1515

1616
<AdditionalIncludeDirectories Condition="'$(Platform)'=='x64'">%(AdditionalIncludeDirectories);$(SolutionDir)dep\xbyak\xbyak</AdditionalIncludeDirectories>

src/core/gpu.cpp

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1579,7 +1579,7 @@ bool GPU::CompileDisplayPipeline()
15791579
plconfig.rasterization = GPUPipeline::RasterizationState::GetNoCullState();
15801580
plconfig.depth = GPUPipeline::DepthState::GetNoTestsState();
15811581
plconfig.blend = GPUPipeline::BlendState::GetNoBlendingState();
1582-
plconfig.color_format = g_gpu_device->HasSurface() ? g_gpu_device->GetWindowFormat() : GPUTexture::Format::RGBA8;
1582+
plconfig.SetTargetFormats(g_gpu_device->HasSurface() ? g_gpu_device->GetWindowFormat() : GPUTexture::Format::RGBA8);
15831583
plconfig.depth_format = GPUTexture::Format::Unknown;
15841584
plconfig.samples = 1;
15851585
plconfig.per_sample_shading = false;
@@ -1670,9 +1670,10 @@ bool GPU::PresentDisplay()
16701670
return RenderDisplay(nullptr, draw_rect, true);
16711671
}
16721672

1673-
bool GPU::RenderDisplay(GPUFramebuffer* target, const Common::Rectangle<s32>& draw_rect, bool postfx)
1673+
bool GPU::RenderDisplay(GPUTexture* target, const Common::Rectangle<s32>& draw_rect, bool postfx)
16741674
{
1675-
GL_SCOPE_FMT("RenderDisplay: {}x{} at {},{}", draw_rect.left, draw_rect.top, draw_rect.GetWidth(), draw_rect.GetHeight());
1675+
GL_SCOPE_FMT("RenderDisplay: {}x{} at {},{}", draw_rect.left, draw_rect.top, draw_rect.GetWidth(),
1676+
draw_rect.GetHeight());
16761677

16771678
if (m_display_texture)
16781679
m_display_texture->MakeReadyForSampling();
@@ -1716,21 +1717,20 @@ bool GPU::RenderDisplay(GPUFramebuffer* target, const Common::Rectangle<s32>& dr
17161717
break;
17171718
}
17181719

1719-
const GPUTexture::Format hdformat =
1720-
(target && target->GetRT()) ? target->GetRT()->GetFormat() : g_gpu_device->GetWindowFormat();
1720+
const GPUTexture::Format hdformat = target ? target->GetFormat() : g_gpu_device->GetWindowFormat();
17211721
const u32 target_width = target ? target->GetWidth() : g_gpu_device->GetWindowWidth();
17221722
const u32 target_height = target ? target->GetHeight() : g_gpu_device->GetWindowHeight();
17231723
const bool really_postfx = (postfx && HasDisplayTexture() && PostProcessing::IsActive() &&
17241724
PostProcessing::CheckTargets(hdformat, target_width, target_height));
17251725
if (really_postfx)
17261726
{
17271727
g_gpu_device->ClearRenderTarget(PostProcessing::GetInputTexture(), 0);
1728-
g_gpu_device->SetFramebuffer(PostProcessing::GetInputFramebuffer());
1728+
g_gpu_device->SetRenderTarget(PostProcessing::GetInputTexture());
17291729
}
17301730
else
17311731
{
17321732
if (target)
1733-
g_gpu_device->SetFramebuffer(target);
1733+
g_gpu_device->SetRenderTarget(target);
17341734
else if (!g_gpu_device->BeginPresent(false))
17351735
return false;
17361736
}
@@ -2059,16 +2059,10 @@ bool GPU::RenderScreenshotToBuffer(u32 width, u32 height, const Common::Rectangl
20592059
if (!render_texture)
20602060
return false;
20612061

2062-
std::unique_ptr<GPUFramebuffer> render_fb = g_gpu_device->CreateFramebuffer(render_texture.get());
2063-
if (!render_fb)
2064-
return false;
2065-
20662062
g_gpu_device->ClearRenderTarget(render_texture.get(), 0);
20672063

20682064
// TODO: this should use copy shader instead.
2069-
RenderDisplay(render_fb.get(), draw_rect, postfx);
2070-
2071-
g_gpu_device->SetFramebuffer(nullptr);
2065+
RenderDisplay(render_texture.get(), draw_rect, postfx);
20722066

20732067
const u32 stride = GPUTexture::GetPixelSize(hdformat) * width;
20742068
out_pixels->resize(width * height);

src/core/gpu.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
class StateWrapper;
2424

2525
class GPUDevice;
26-
class GPUFramebuffer;
2726
class GPUTexture;
2827
class GPUPipeline;
2928

@@ -585,7 +584,7 @@ class GPU
585584
float* out_top_padding, float* out_scale, float* out_x_scale,
586585
bool apply_aspect_ratio = true) const;
587586

588-
bool RenderDisplay(GPUFramebuffer* target, const Common::Rectangle<s32>& draw_rect, bool postfx);
587+
bool RenderDisplay(GPUTexture* target, const Common::Rectangle<s32>& draw_rect, bool postfx);
589588

590589
s32 m_display_width = 0;
591590
s32 m_display_height = 0;

src/core/gpu_hw.cpp

Lines changed: 19 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -317,7 +317,7 @@ bool GPU_HW::DoState(StateWrapper& sw, GPUTexture** host_texture, bool update_di
317317
void GPU_HW::RestoreDeviceContext()
318318
{
319319
g_gpu_device->SetTextureSampler(0, m_vram_read_texture.get(), g_gpu_device->GetNearestSampler());
320-
g_gpu_device->SetFramebuffer(m_vram_framebuffer.get());
320+
g_gpu_device->SetRenderTarget(m_vram_texture.get(), m_vram_depth_texture.get());
321321
g_gpu_device->SetViewport(0, 0, m_vram_texture->GetWidth(), m_vram_texture->GetHeight());
322322
SetScissor();
323323
m_batch_ubo_dirty = true;
@@ -649,20 +649,6 @@ bool GPU_HW::CreateBuffers()
649649
GL_OBJECT_NAME(m_display_private_texture, "Display Texture");
650650
GL_OBJECT_NAME(m_vram_readback_texture, "VRAM Readback Texture");
651651

652-
// vram framebuffer has both colour and depth
653-
if (!(m_vram_framebuffer = g_gpu_device->CreateFramebuffer(m_vram_texture.get(), m_vram_depth_texture.get())) ||
654-
!(m_vram_update_depth_framebuffer = g_gpu_device->CreateFramebuffer(m_vram_depth_texture.get())) ||
655-
!(m_vram_readback_framebuffer = g_gpu_device->CreateFramebuffer(m_vram_readback_texture.get())) ||
656-
!(m_display_framebuffer = g_gpu_device->CreateFramebuffer(m_display_private_texture.get())))
657-
{
658-
return false;
659-
}
660-
661-
GL_OBJECT_NAME(m_vram_framebuffer, "VRAM Framebuffer");
662-
GL_OBJECT_NAME(m_vram_update_depth_framebuffer, "VRAM Update Depth Framebuffer");
663-
GL_OBJECT_NAME(m_vram_readback_framebuffer, "VRAM Readback Framebuffer");
664-
GL_OBJECT_NAME(m_display_framebuffer, "Display Framebuffer");
665-
666652
if (!(m_vram_upload_buffer =
667653
g_gpu_device->CreateTextureBuffer(GPUTextureBuffer::Format::R16UI, GPUDevice::MIN_TEXEL_BUFFER_ELEMENTS)))
668654
{
@@ -679,11 +665,9 @@ bool GPU_HW::CreateBuffers()
679665
GPUTexture::Type::Texture, VRAM_RT_FORMAT)) ||
680666
!(m_downsample_render_texture = g_gpu_device->CreateTexture(texture_width, texture_height, 1, 1, 1,
681667
GPUTexture::Type::RenderTarget, VRAM_RT_FORMAT)) ||
682-
!(m_downsample_framebuffer = g_gpu_device->CreateFramebuffer(m_downsample_render_texture.get())) ||
683668
!(m_downsample_weight_texture =
684669
g_gpu_device->CreateTexture(texture_width >> (levels - 1), texture_height >> (levels - 1), 1, 1, 1,
685-
GPUTexture::Type::RenderTarget, GPUTexture::Format::R8)) ||
686-
!(m_downsample_weight_framebuffer = g_gpu_device->CreateFramebuffer(m_downsample_weight_texture.get())))
670+
GPUTexture::Type::RenderTarget, GPUTexture::Format::R8)))
687671
{
688672
return false;
689673
}
@@ -693,14 +677,13 @@ bool GPU_HW::CreateBuffers()
693677
const u32 downsample_scale = GetBoxDownsampleScale(m_resolution_scale);
694678
if (!(m_downsample_render_texture =
695679
g_gpu_device->CreateTexture(VRAM_WIDTH * downsample_scale, VRAM_HEIGHT * downsample_scale, 1, 1, 1,
696-
GPUTexture::Type::RenderTarget, VRAM_RT_FORMAT)) ||
697-
!(m_downsample_framebuffer = g_gpu_device->CreateFramebuffer(m_downsample_render_texture.get())))
680+
GPUTexture::Type::RenderTarget, VRAM_RT_FORMAT)))
698681
{
699682
return false;
700683
}
701684
}
702685

703-
g_gpu_device->SetFramebuffer(m_vram_framebuffer.get());
686+
g_gpu_device->SetRenderTarget(m_vram_texture.get(), m_vram_depth_texture.get());
704687
SetFullVRAMDirtyRectangle();
705688
return true;
706689
}
@@ -719,15 +702,9 @@ void GPU_HW::DestroyBuffers()
719702
ClearDisplayTexture();
720703

721704
m_vram_upload_buffer.reset();
722-
m_downsample_weight_framebuffer.reset();
723705
m_downsample_weight_texture.reset();
724-
m_downsample_framebuffer.reset();
725706
m_downsample_render_texture.reset();
726707
m_downsample_texture.reset();
727-
m_display_framebuffer.reset();
728-
m_vram_readback_framebuffer.reset();
729-
m_vram_update_depth_framebuffer.reset();
730-
m_vram_framebuffer.reset();
731708
m_vram_read_texture.reset();
732709
m_vram_depth_texture.reset();
733710
m_vram_texture.reset();
@@ -833,8 +810,7 @@ bool GPU_HW::CompilePipelines()
833810
plconfig.input_layout.vertex_stride = sizeof(BatchVertex);
834811
plconfig.rasterization = GPUPipeline::RasterizationState::GetNoCullState();
835812
plconfig.primitive = GPUPipeline::Primitive::Triangles;
836-
plconfig.color_format = VRAM_RT_FORMAT;
837-
plconfig.depth_format = VRAM_DS_FORMAT;
813+
plconfig.SetTargetFormats(VRAM_RT_FORMAT, VRAM_DS_FORMAT);
838814
plconfig.samples = m_multisamples;
839815
plconfig.per_sample_shading = m_per_sample_shading;
840816
plconfig.geometry_shader = nullptr;
@@ -1080,8 +1056,7 @@ bool GPU_HW::CompilePipelines()
10801056
return false;
10811057

10821058
plconfig.fragment_shader = fs.get();
1083-
plconfig.color_format = GPUTexture::Format::Unknown;
1084-
plconfig.depth_format = VRAM_DS_FORMAT;
1059+
plconfig.SetTargetFormats(GPUTexture::Format::Unknown, VRAM_DS_FORMAT);
10851060
plconfig.depth = GPUPipeline::DepthState::GetAlwaysWriteState();
10861061
plconfig.blend.write_mask = 0;
10871062

@@ -1093,8 +1068,7 @@ bool GPU_HW::CompilePipelines()
10931068
progress.Increment();
10941069
}
10951070

1096-
plconfig.color_format = VRAM_RT_FORMAT;
1097-
plconfig.depth_format = GPUTexture::Format::Unknown;
1071+
plconfig.SetTargetFormats(VRAM_RT_FORMAT);
10981072
plconfig.depth = GPUPipeline::DepthState::GetNoTestsState();
10991073
plconfig.blend = GPUPipeline::BlendState::GetNoBlendingState();
11001074
plconfig.samples = 1;
@@ -1181,7 +1155,7 @@ bool GPU_HW::CompilePipelines()
11811155
return false;
11821156
GL_OBJECT_NAME(fs, "Downsample Blur Pass Fragment Shader");
11831157
plconfig.fragment_shader = fs.get();
1184-
plconfig.color_format = GPUTexture::Format::R8;
1158+
plconfig.SetTargetFormats(GPUTexture::Format::R8);
11851159
if (!(m_downsample_blur_pass_pipeline = g_gpu_device->CreatePipeline(plconfig)))
11861160
return false;
11871161
GL_OBJECT_NAME(m_downsample_blur_pass_pipeline, "Downsample Blur Pass Pipeline");
@@ -1193,7 +1167,7 @@ bool GPU_HW::CompilePipelines()
11931167
GL_OBJECT_NAME(fs, "Downsample Composite Pass Fragment Shader");
11941168
plconfig.layout = GPUPipeline::Layout::MultiTextureAndPushConstants;
11951169
plconfig.fragment_shader = fs.get();
1196-
plconfig.color_format = VRAM_RT_FORMAT;
1170+
plconfig.SetTargetFormats(VRAM_RT_FORMAT);
11971171
if (!(m_downsample_composite_pass_pipeline = g_gpu_device->CreatePipeline(plconfig)))
11981172
return false;
11991173
GL_OBJECT_NAME(m_downsample_composite_pass_pipeline, "Downsample Blur Pass Pipeline");
@@ -1310,14 +1284,15 @@ void GPU_HW::UpdateDepthBufferFromMaskBit()
13101284

13111285
// Viewport should already be set full, only need to fudge the scissor.
13121286
g_gpu_device->SetScissor(0, 0, m_vram_texture->GetWidth(), m_vram_texture->GetHeight());
1313-
g_gpu_device->SetFramebuffer(m_vram_update_depth_framebuffer.get());
1287+
g_gpu_device->InvalidateRenderTarget(m_vram_depth_texture.get());
1288+
g_gpu_device->SetRenderTargets(nullptr, 0, m_vram_depth_texture.get());
13141289
g_gpu_device->SetPipeline(m_vram_update_depth_pipeline.get());
13151290
g_gpu_device->SetTextureSampler(0, m_vram_texture.get(), g_gpu_device->GetNearestSampler());
13161291
g_gpu_device->Draw(3, 0);
13171292

13181293
// Restore.
13191294
g_gpu_device->SetTextureSampler(0, m_vram_read_texture.get(), g_gpu_device->GetNearestSampler());
1320-
g_gpu_device->SetFramebuffer(m_vram_framebuffer.get());
1295+
g_gpu_device->SetRenderTarget(m_vram_texture.get(), m_vram_depth_texture.get());
13211296
SetScissor();
13221297
}
13231298

@@ -2061,7 +2036,7 @@ bool GPU_HW::BlitVRAMReplacementTexture(const TextureReplacementTexture* tex, u3
20612036
}
20622037
}
20632038

2064-
g_gpu_device->SetFramebuffer(m_vram_framebuffer.get()); // TODO: needed?
2039+
g_gpu_device->SetRenderTarget(m_vram_texture.get(), m_vram_depth_texture.get()); // TODO: needed?
20652040
g_gpu_device->SetTextureSampler(0, m_vram_replacement_texture.get(), g_gpu_device->GetLinearSampler());
20662041
g_gpu_device->SetPipeline(m_copy_pipeline.get());
20672042
g_gpu_device->SetViewportAndScissor(dst_x, dst_y, width, height);
@@ -2364,7 +2339,7 @@ void GPU_HW::ReadVRAM(u32 x, u32 y, u32 width, u32 height)
23642339

23652340
// Encode the 24-bit texture as 16-bit.
23662341
const u32 uniforms[4] = {copy_rect.left, copy_rect.top, copy_rect.GetWidth(), copy_rect.GetHeight()};
2367-
g_gpu_device->SetFramebuffer(m_vram_readback_framebuffer.get());
2342+
g_gpu_device->SetRenderTarget(m_vram_readback_texture.get());
23682343
g_gpu_device->SetPipeline(m_vram_readback_pipeline.get());
23692344
g_gpu_device->SetTextureSampler(0, m_vram_texture.get(), g_gpu_device->GetNearestSampler());
23702345
g_gpu_device->SetViewportAndScissor(0, 0, encoded_width, encoded_height);
@@ -2811,7 +2786,7 @@ void GPU_HW::UpdateDisplay()
28112786
if (interlaced == InterlacedRenderMode::None)
28122787
g_gpu_device->InvalidateRenderTarget(m_display_private_texture.get());
28132788

2814-
g_gpu_device->SetFramebuffer(m_display_framebuffer.get());
2789+
g_gpu_device->SetRenderTarget(m_display_private_texture.get());
28152790
g_gpu_device->SetPipeline(
28162791
m_display_pipelines[BoolToUInt8(m_GPUSTAT.display_area_color_depth_24)][static_cast<u8>(interlaced)].get());
28172792
g_gpu_device->SetTextureSampler(0, m_vram_texture.get(), g_gpu_device->GetNearestSampler());
@@ -2883,7 +2858,7 @@ void GPU_HW::DownsampleFramebufferAdaptive(GPUTexture* source, u32 left, u32 top
28832858
uniforms.lod = static_cast<float>(level - 1);
28842859

28852860
g_gpu_device->ClearRenderTarget(m_downsample_render_texture.get(), 0);
2886-
g_gpu_device->SetFramebuffer(m_downsample_framebuffer.get());
2861+
g_gpu_device->SetRenderTarget(m_downsample_render_texture.get());
28872862
g_gpu_device->SetViewportAndScissor(0, 0, level_width, level_height);
28882863
g_gpu_device->SetPipeline((level == 1) ? m_downsample_first_pass_pipeline.get() :
28892864
m_downsample_mid_pass_pipeline.get());
@@ -2912,7 +2887,7 @@ void GPU_HW::DownsampleFramebufferAdaptive(GPUTexture* source, u32 left, u32 top
29122887

29132888
m_downsample_render_texture->MakeReadyForSampling();
29142889
g_gpu_device->ClearRenderTarget(m_downsample_weight_texture.get(), 0);
2915-
g_gpu_device->SetFramebuffer(m_downsample_weight_framebuffer.get());
2890+
g_gpu_device->SetRenderTarget(m_downsample_weight_texture.get());
29162891
g_gpu_device->SetTextureSampler(0, m_downsample_render_texture.get(), g_gpu_device->GetNearestSampler());
29172892
g_gpu_device->SetViewportAndScissor(0, 0, last_width, last_height);
29182893
g_gpu_device->SetPipeline(m_downsample_blur_pass_pipeline.get());
@@ -2926,7 +2901,7 @@ void GPU_HW::DownsampleFramebufferAdaptive(GPUTexture* source, u32 left, u32 top
29262901
GL_SCOPE("Composite");
29272902

29282903
g_gpu_device->ClearRenderTarget(m_downsample_render_texture.get(), 0);
2929-
g_gpu_device->SetFramebuffer(m_downsample_framebuffer.get());
2904+
g_gpu_device->SetRenderTarget(m_downsample_render_texture.get());
29302905
g_gpu_device->SetTextureSampler(0, m_downsample_texture.get(), m_downsample_composite_sampler.get());
29312906
g_gpu_device->SetTextureSampler(1, m_downsample_weight_texture.get(), m_downsample_lod_sampler.get());
29322907
g_gpu_device->SetViewportAndScissor(0, 0, width, height);
@@ -2953,7 +2928,7 @@ void GPU_HW::DownsampleFramebufferBoxFilter(GPUTexture* source, u32 left, u32 to
29532928
source->MakeReadyForSampling();
29542929

29552930
g_gpu_device->ClearRenderTarget(m_downsample_render_texture.get(), 0);
2956-
g_gpu_device->SetFramebuffer(m_downsample_framebuffer.get());
2931+
g_gpu_device->SetRenderTarget(m_downsample_render_texture.get());
29572932
g_gpu_device->SetPipeline(m_downsample_first_pass_pipeline.get());
29582933
g_gpu_device->SetTextureSampler(0, source, g_gpu_device->GetNearestSampler());
29592934
g_gpu_device->SetViewportAndScissor(ds_left, ds_top, ds_width, ds_height);

src/core/gpu_hw.h

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -213,11 +213,6 @@ class GPU_HW final : public GPU
213213
std::unique_ptr<GPUTexture> m_vram_replacement_texture;
214214
std::unique_ptr<GPUTexture> m_display_private_texture; // TODO: Move to base.
215215

216-
std::unique_ptr<GPUFramebuffer> m_vram_framebuffer;
217-
std::unique_ptr<GPUFramebuffer> m_vram_update_depth_framebuffer;
218-
std::unique_ptr<GPUFramebuffer> m_vram_readback_framebuffer;
219-
std::unique_ptr<GPUFramebuffer> m_display_framebuffer;
220-
221216
std::unique_ptr<GPUTextureBuffer> m_vram_upload_buffer;
222217
std::unique_ptr<GPUTexture> m_vram_write_texture;
223218

@@ -288,9 +283,7 @@ class GPU_HW final : public GPU
288283

289284
std::unique_ptr<GPUTexture> m_downsample_texture;
290285
std::unique_ptr<GPUTexture> m_downsample_render_texture;
291-
std::unique_ptr<GPUFramebuffer> m_downsample_framebuffer;
292286
std::unique_ptr<GPUTexture> m_downsample_weight_texture;
293-
std::unique_ptr<GPUFramebuffer> m_downsample_weight_framebuffer;
294287
std::unique_ptr<GPUPipeline> m_downsample_first_pass_pipeline;
295288
std::unique_ptr<GPUPipeline> m_downsample_mid_pass_pipeline;
296289
std::unique_ptr<GPUPipeline> m_downsample_blur_pass_pipeline;

src/core/shader_cache_version.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,4 @@
44
#pragma once
55
#include "common/types.h"
66

7-
static constexpr u32 SHADER_CACHE_VERSION = 10;
7+
static constexpr u32 SHADER_CACHE_VERSION = 11;

src/util/CMakeLists.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ add_library(util
2323
cue_parser.h
2424
gpu_device.cpp
2525
gpu_device.h
26+
gpu_framebuffer_manager.h
2627
gpu_shader_cache.cpp
2728
gpu_shader_cache.h
2829
gpu_texture.cpp
@@ -72,7 +73,7 @@ target_precompile_headers(util PRIVATE "pch.h")
7273
target_include_directories(util PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/..")
7374
target_include_directories(util PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/..")
7475
target_link_libraries(util PUBLIC common simpleini imgui)
75-
target_link_libraries(util PRIVATE stb libchdr zlib soundtouch Zstd::Zstd reshadefx)
76+
target_link_libraries(util PRIVATE stb libchdr zlib soundtouch xxhash Zstd::Zstd reshadefx)
7677

7778
if(ENABLE_CUBEB)
7879
target_sources(util PRIVATE

0 commit comments

Comments
 (0)