This fixes an issue where reusing the same EffectChain from two different GL
contexts would cause errors even if they are shared, because FBOs cannot be
shared between contexts (in the ARB extension, anyway).
There might be some negative performance implications to this, but I was unable
to measure any on Intel/Mesa. If this should prove to be a problem in the future,
we could maybe keep one around per context, or have the caller invalidate the
FBO for us.
: aspect_nom(aspect_nom),
aspect_denom(aspect_denom),
dither_effect(NULL),
: aspect_nom(aspect_nom),
aspect_denom(aspect_denom),
dither_effect(NULL),
num_dither_bits(0),
finalized(false) {}
num_dither_bits(0),
finalized(false) {}
glDeleteShader(phases[i]->fragment_shader);
delete phases[i];
}
glDeleteShader(phases[i]->fragment_shader);
delete phases[i];
}
- if (fbo != 0) {
- glDeleteFramebuffers(1, &fbo);
- }
}
Input *EffectChain::add_input(Input *input)
}
Input *EffectChain::add_input(Input *input)
// since otherwise this turns into an (albeit simple)
// register allocation problem.
if (phases.size() > 1) {
// since otherwise this turns into an (albeit simple)
// register allocation problem.
if (phases.size() > 1) {
- glGenFramebuffers(1, &fbo);
-
for (unsigned i = 0; i < phases.size() - 1; ++i) {
inform_input_sizes(phases[i]);
find_output_size(phases[i]);
for (unsigned i = 0; i < phases.size() - 1; ++i) {
inform_input_sizes(phases[i]);
find_output_size(phases[i]);
// Save original viewport.
GLuint x = 0, y = 0;
// Save original viewport.
GLuint x = 0, y = 0;
if (width == 0 && height == 0) {
GLint viewport[4];
if (width == 0 && height == 0) {
GLint viewport[4];
glLoadIdentity();
if (phases.size() > 1) {
glLoadIdentity();
if (phases.size() > 1) {
+ glGenFramebuffers(1, &fbo);
+ check_error();
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
check_error();
}
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
check_error();
}
node->effect->clear_gl_state();
}
}
node->effect->clear_gl_state();
}
}
+
+ glBindFramebuffer(GL_FRAMEBUFFER, 0);
+ check_error();
+
+ if (fbo != 0) {
+ glDeleteFramebuffers(1, &fbo);
+ check_error();
+ }
Effect *dither_effect;
std::vector<Input *> inputs; // Also contained in nodes.
Effect *dither_effect;
std::vector<Input *> inputs; // Also contained in nodes.
std::vector<Phase *> phases;
unsigned num_dither_bits;
std::vector<Phase *> phases;
unsigned num_dither_bits;