From 8779cb778554bffef2b707b85b88aa207ea4aec1 Mon Sep 17 00:00:00 2001 From: GPUCode Date: Mon, 2 Jan 2023 16:22:51 +0200 Subject: [PATCH] renderer_opengl: Fix shader compilation * Also use glCopyImageSubData to do texture copies' --- .../renderer_opengl/gl_resource_manager.cpp | 11 ++++++----- .../renderer_opengl/gl_texture_runtime.cpp | 18 ++++++------------ .../renderer_vulkan/vk_texture_runtime.cpp | 1 + 3 files changed, 13 insertions(+), 17 deletions(-) diff --git a/src/video_core/renderer_opengl/gl_resource_manager.cpp b/src/video_core/renderer_opengl/gl_resource_manager.cpp index bfaae4204..90f014439 100644 --- a/src/video_core/renderer_opengl/gl_resource_manager.cpp +++ b/src/video_core/renderer_opengl/gl_resource_manager.cpp @@ -118,18 +118,18 @@ void OGLSampler::Release() { } void OGLShader::Create(std::string_view source, GLenum type) { - if (handle != 0) - return; - if (source == nullptr) + if (handle != 0 || source.empty()) { return; + } MICROPROFILE_SCOPE(OpenGL_ResourceCreation); handle = LoadShader(source, type); } void OGLShader::Release() { - if (handle == 0) + if (handle == 0) { return; + } MICROPROFILE_SCOPE(OpenGL_ResourceDeletion); glDeleteShader(handle); @@ -137,8 +137,9 @@ void OGLShader::Release() { } void OGLProgram::Create(bool separable_program, const std::vector& shaders) { - if (handle != 0) + if (handle != 0) { return; + } MICROPROFILE_SCOPE(OpenGL_ResourceCreation); handle = LoadProgram(separable_program, shaders); diff --git a/src/video_core/renderer_opengl/gl_texture_runtime.cpp b/src/video_core/renderer_opengl/gl_texture_runtime.cpp index f45481f80..b37b0377c 100644 --- a/src/video_core/renderer_opengl/gl_texture_runtime.cpp +++ b/src/video_core/renderer_opengl/gl_texture_runtime.cpp @@ -222,18 +222,12 @@ bool TextureRuntime::ClearTexture(Surface& surface, const VideoCore::TextureClea bool TextureRuntime::CopyTextures(Surface& source, Surface& dest, const VideoCore::TextureCopy& copy) { - // Emulate texture copy with blit for now - const VideoCore::TextureBlit blit = { - .src_level = copy.src_level, - .dst_level = copy.dst_level, - .src_layer = copy.src_layer, - .dst_layer = copy.dst_layer, - .src_rect = {copy.src_offset.x, copy.src_offset.y + copy.extent.height, - copy.src_offset.x + copy.extent.width, copy.src_offset.y}, - .dst_rect = {copy.dst_offset.x, copy.dst_offset.y + copy.extent.height, - copy.dst_offset.x + copy.extent.width, copy.dst_offset.y}}; - - return BlitTextures(source, dest, blit); + glCopyImageSubData(source.texture.handle, GL_TEXTURE_2D, + copy.src_level, copy.src_offset.x, copy.src_offset.y, 0, + dest.texture.handle, GL_TEXTURE_2D, + copy.dst_level, copy.dst_offset.x, copy.dst_offset.y, 0, + copy.extent.width, copy.extent.height, 1); + return true; } bool TextureRuntime::BlitTextures(Surface& source, Surface& dest, diff --git a/src/video_core/renderer_vulkan/vk_texture_runtime.cpp b/src/video_core/renderer_vulkan/vk_texture_runtime.cpp index b6334690e..e71a3ddb8 100644 --- a/src/video_core/renderer_vulkan/vk_texture_runtime.cpp +++ b/src/video_core/renderer_vulkan/vk_texture_runtime.cpp @@ -338,6 +338,7 @@ ImageAlloc TextureRuntime::Allocate(u32 width, u32 height, VideoCore::PixelForma alloc.storage_view = device.createImageView(storage_view_info); } + renderpass_cache.ExitRenderpass(); scheduler.Record([image = alloc.image, aspect = alloc.aspect](vk::CommandBuffer cmdbuf) { const vk::ImageMemoryBarrier init_barrier = { .srcAccessMask = vk::AccessFlagBits::eNone,