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 | |
| 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')
| -rw-r--r-- | Source/Core/VideoBackends/OGL/ProgramShaderCache.cpp | 34 | ||||
| -rw-r--r-- | Source/Core/VideoBackends/OGL/ProgramShaderCache.h | 3 |
2 files changed, 37 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) 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<cInterfaceBase> context; + GLuint prerender_FBO; + GLuint prerender_FBO_tex; + GLuint prerender_FBO_depth; GLuint prerender_VBO; GLuint prerender_VAO; GLuint prerender_IBO; |
