summaryrefslogtreecommitdiff
path: root/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp
diff options
context:
space:
mode:
authorStenzek <stenzek@gmail.com>2017-07-31 22:39:52 +1000
committerStenzek <stenzek@gmail.com>2017-08-02 20:12:28 +1000
commit67997529b8a49a5ca4130227ce4f2e0ca14309af (patch)
treec126f05ec68e6002b40dbbcc91790a892ae2fb8a /Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp
parentd0bcdc7f89c0eb3b7c734d19fd150c9bc21aa4fc (diff)
ProgramShaderCache: Create a FBO for shared contexts to draw into
This way it allows us to use surfaceless contexts in EGL/GLX. It also ensures that the shared context shares a similar setup to the main context's framebuffer, potentially reducing the number of variants a driver needs to generate.
Diffstat (limited to 'Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp')
-rw-r--r--Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp34
1 files changed, 34 insertions, 0 deletions
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)