From eb080834ad30553da1f12337f15c004ff0356e0a Mon Sep 17 00:00:00 2001 From: Stenzek Date: Sun, 8 Oct 2023 01:10:52 +1000 Subject: [PATCH] OpenGLDevice: Actually check max texture buffer size --- src/core/gpu_hw.cpp | 4 ++-- src/core/gpu_hw.h | 3 +-- src/util/d3d12_device.cpp | 2 -- src/util/gpu_device.h | 1 + src/util/opengl_device.cpp | 21 ++++++++++++++++++--- src/util/vulkan_device.cpp | 2 -- 6 files changed, 22 insertions(+), 11 deletions(-) diff --git a/src/core/gpu_hw.cpp b/src/core/gpu_hw.cpp index 931078ac0..1fac707d5 100644 --- a/src/core/gpu_hw.cpp +++ b/src/core/gpu_hw.cpp @@ -650,8 +650,8 @@ bool GPU_HW::CreateBuffers() GL_OBJECT_NAME(m_vram_readback_framebuffer, "VRAM Readback Framebuffer"); GL_OBJECT_NAME(m_display_framebuffer, "Display Framebuffer"); - if (!(m_vram_upload_buffer = g_gpu_device->CreateTextureBuffer(GPUTextureBuffer::Format::R16UI, - VRAM_UPDATE_TEXTURE_BUFFER_SIZE / sizeof(u16)))) + if (!(m_vram_upload_buffer = + g_gpu_device->CreateTextureBuffer(GPUTextureBuffer::Format::R16UI, GPUDevice::MIN_TEXEL_BUFFER_ELEMENTS))) { return false; } diff --git a/src/core/gpu_hw.h b/src/core/gpu_hw.h index a2efd9a7f..414ee75db 100644 --- a/src/core/gpu_hw.h +++ b/src/core/gpu_hw.h @@ -62,12 +62,11 @@ public: private: enum : u32 { - VRAM_UPDATE_TEXTURE_BUFFER_SIZE = 4 * 1024 * 1024, MAX_BATCH_VERTEX_COUNTER_IDS = 65536 - 2, MAX_VERTICES_FOR_RECTANGLE = 6 * (((MAX_PRIMITIVE_WIDTH + (TEXTURE_PAGE_WIDTH - 1)) / TEXTURE_PAGE_WIDTH) + 1u) * (((MAX_PRIMITIVE_HEIGHT + (TEXTURE_PAGE_HEIGHT - 1)) / TEXTURE_PAGE_HEIGHT) + 1u) }; - static_assert(VRAM_UPDATE_TEXTURE_BUFFER_SIZE >= VRAM_WIDTH * VRAM_HEIGHT * sizeof(u16)); + static_assert(GPUDevice::MIN_TEXEL_BUFFER_ELEMENTS >= (VRAM_WIDTH * VRAM_HEIGHT)); struct BatchVertex { diff --git a/src/util/d3d12_device.cpp b/src/util/d3d12_device.cpp index 21dd17f57..0f05e9759 100644 --- a/src/util/d3d12_device.cpp +++ b/src/util/d3d12_device.cpp @@ -31,8 +31,6 @@ Log_SetChannel(D3D12Device); // Tweakables enum : u32 { - MIN_TEXEL_BUFFER_ELEMENTS = 1024 * 512, - MAX_DRAW_CALLS_PER_FRAME = 2048, MAX_DESCRIPTORS_PER_FRAME = 32768, MAX_SAMPLERS_PER_FRAME = D3D12_MAX_SHADER_VISIBLE_SAMPLER_HEAP_SIZE, diff --git a/src/util/gpu_device.h b/src/util/gpu_device.h index 095c94407..cb4cc11ac 100644 --- a/src/util/gpu_device.h +++ b/src/util/gpu_device.h @@ -460,6 +460,7 @@ public: }; static constexpr u32 MAX_TEXTURE_SAMPLERS = 8; + static constexpr u32 MIN_TEXEL_BUFFER_ELEMENTS = 4 * 1024 * 512; virtual ~GPUDevice(); diff --git a/src/util/opengl_device.cpp b/src/util/opengl_device.cpp index c6ef0f360..fdd35c62e 100644 --- a/src/util/opengl_device.cpp +++ b/src/util/opengl_device.cpp @@ -414,7 +414,9 @@ bool OpenGLDevice::CheckFeatures(bool* buggy_pbo) GLint max_texture_size = 1024; GLint max_samples = 1; glGetIntegerv(GL_MAX_TEXTURE_SIZE, &max_texture_size); + Log_DevFmt("GL_MAX_TEXTURE_SIZE: {}", max_texture_size); glGetIntegerv(GL_MAX_SAMPLES, &max_samples); + Log_DevFmt("GL_MAX_SAMPLES: {}", max_samples); m_max_texture_size = std::max(1024u, static_cast(max_texture_size)); m_max_multisamples = std::max(1u, static_cast(max_samples)); @@ -433,6 +435,19 @@ bool OpenGLDevice::CheckFeatures(bool* buggy_pbo) // And Samsung's ANGLE/GLES driver? if (std::strstr(reinterpret_cast(glGetString(GL_RENDERER)), "ANGLE")) m_features.supports_texture_buffers = false; + + if (m_features.supports_texture_buffers) + { + GLint max_texel_buffer_size = 0; + glGetIntegerv(GL_MAX_TEXTURE_BUFFER_SIZE, reinterpret_cast(&max_texel_buffer_size)); + Log_DevFmt("GL_MAX_TEXTURE_BUFFER_SIZE: {}", max_texel_buffer_size); + if (max_texel_buffer_size < static_cast(MIN_TEXEL_BUFFER_ELEMENTS)) + { + Log_WarningFmt("GL_MAX_TEXTURE_BUFFER_SIZE ({}) is below required minimum ({}), not using texture buffers.", + max_texel_buffer_size, MIN_TEXEL_BUFFER_ELEMENTS); + m_features.supports_texture_buffers = false; + } + } #endif if (!m_features.supports_texture_buffers) @@ -446,8 +461,8 @@ bool OpenGLDevice::CheckFeatures(bool* buggy_pbo) glGetInteger64v(GL_MAX_SHADER_STORAGE_BLOCK_SIZE, &max_ssbo_size); } - Log_InfoPrintf("Max fragment shader storage blocks: %d", max_fragment_storage_blocks); - Log_InfoPrintf("Max shader storage buffer size: %" PRId64, max_ssbo_size); + Log_DevFmt("GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS: {}", max_fragment_storage_blocks); + Log_DevFmt("GL_MAX_SHADER_STORAGE_BLOCK_SIZE: {}", max_ssbo_size); m_features.texture_buffers_emulated_with_ssbo = (max_fragment_storage_blocks > 0 && max_ssbo_size >= static_cast(1024 * 512 * sizeof(u16))); if (m_features.texture_buffers_emulated_with_ssbo) @@ -486,7 +501,7 @@ bool OpenGLDevice::CheckFeatures(bool* buggy_pbo) // check that there's at least one format and the extension isn't being "faked" GLint num_formats = 0; glGetIntegerv(GL_NUM_PROGRAM_BINARY_FORMATS, &num_formats); - Log_InfoPrintf("%u program binary formats supported by driver", num_formats); + Log_DevFmt("{} program binary formats supported by driver", num_formats); m_features.pipeline_cache = (num_formats > 0); } diff --git a/src/util/vulkan_device.cpp b/src/util/vulkan_device.cpp index 86c9798b5..ae57af69b 100644 --- a/src/util/vulkan_device.cpp +++ b/src/util/vulkan_device.cpp @@ -42,8 +42,6 @@ struct VK_PIPELINE_CACHE_HEADER // Tweakables enum : u32 { - MIN_TEXEL_BUFFER_ELEMENTS = 1024 * 512, - MAX_DRAW_CALLS_PER_FRAME = 2048, MAX_COMBINED_IMAGE_SAMPLER_DESCRIPTORS_PER_FRAME = GPUDevice::MAX_TEXTURE_SAMPLERS * MAX_DRAW_CALLS_PER_FRAME, MAX_DESCRIPTOR_SETS_PER_FRAME = MAX_DRAW_CALLS_PER_FRAME,