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.
This commit is contained in:
parent
d0bcdc7f89
commit
67997529b8
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue