diff options
| author | Stenzek <stenzek@gmail.com> | 2017-07-31 22:39:52 +1000 |
|---|---|---|
| committer | Stenzek <stenzek@gmail.com> | 2017-08-02 20:12:28 +1000 |
| commit | 67997529b8a49a5ca4130227ce4f2e0ca14309af (patch) | |
| tree | c126f05ec68e6002b40dbbcc91790a892ae2fb8a /Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp | |
| parent | d0bcdc7f89c0eb3b7c734d19fd150c9bc21aa4fc (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.cpp | 34 |
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) |
