summaryrefslogtreecommitdiff
path: root/Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp
diff options
context:
space:
mode:
authorAnthony <Helios747@users.noreply.github.com>2017-08-05 00:54:28 -0700
committerGitHub <noreply@github.com>2017-08-05 00:54:28 -0700
commit3c5112bb21d2829c48622467c1993c3deb3e4412 (patch)
treebcd8a44ba1e7a63c85712fe9469f9db623cce77c /Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp
parent4f2fd3a9e527358694c594b0eafbe1865979d3c3 (diff)
parent287859c5e13f2e6e35edc021bccf9ef08737537d (diff)
Merge pull request #5856 from stenzek/optimus-crash
Fix ubershader crashes with primus/bumblebee
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)