diff --git a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp index c467115534..a4a0a8bf08 100644 --- a/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp +++ b/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp @@ -1175,6 +1175,24 @@ void ProgramShaderCache::UberShaderCompileWorkItem::Retrieve() void ProgramShaderCache::CreatePrerenderArrays(SharedContextData* data) { + // Create a framebuffer object to render into. + // This is because in EGL, and potentially GLX, we have a surfaceless context. + glGenTextures(1, &data->prerender_FBO_tex); + glBindTexture(GL_TEXTURE_2D_ARRAY, data->prerender_FBO_tex); + glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); + glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL, 1); + glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glGenTextures(1, &data->prerender_FBO_depth); + glBindTexture(GL_TEXTURE_2D_ARRAY, data->prerender_FBO_depth); + glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_DEPTH_COMPONENT32F, 1, 1, 1, 0, GL_DEPTH_COMPONENT, + GL_FLOAT, nullptr); + glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL, 1); + glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glGenFramebuffers(1, &data->prerender_FBO); + glBindFramebuffer(GL_FRAMEBUFFER, data->prerender_FBO); + glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, data->prerender_FBO_tex, 0, 0); + glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, data->prerender_FBO_depth, 0, 0); + // Create VAO for the prerender vertices. // We don't use the normal VAO map, since we need to change the VBO pointer. glGenVertexArrays(1, &data->prerender_VAO); @@ -1257,6 +1275,22 @@ void ProgramShaderCache::DestroyPrerenderArrays(SharedContextData* data) glDeleteBuffers(1, &data->prerender_IBO); data->prerender_IBO = 0; } + if (data->prerender_FBO) + { + glBindFramebuffer(GL_FRAMEBUFFER, 0); + glDeleteFramebuffers(1, &data->prerender_FBO); + data->prerender_FBO = 0; + } + if (data->prerender_FBO_tex) + { + glDeleteTextures(1, &data->prerender_FBO_tex); + data->prerender_FBO_tex = 0; + } + if (data->prerender_FBO_depth) + { + glDeleteTextures(1, &data->prerender_FBO_depth); + data->prerender_FBO_depth = 0; + } } void ProgramShaderCache::DrawPrerenderArray(const SHADER& shader, u32 primitive_type) diff --git a/Source/Core/VideoBackends/OGL/ProgramShaderCache.h b/Source/Core/VideoBackends/OGL/ProgramShaderCache.h index 61f2f68fdc..41b1d4bb41 100644 --- a/Source/Core/VideoBackends/OGL/ProgramShaderCache.h +++ b/Source/Core/VideoBackends/OGL/ProgramShaderCache.h @@ -154,6 +154,9 @@ private: struct SharedContextData { std::unique_ptr context; + GLuint prerender_FBO; + GLuint prerender_FBO_tex; + GLuint prerender_FBO_depth; GLuint prerender_VBO; GLuint prerender_VAO; GLuint prerender_IBO;