diff --git a/changes.txt b/changes.txt index f7204c1c6..b8cbfa983 100644 --- a/changes.txt +++ b/changes.txt @@ -20,6 +20,7 @@ Released: N/A * Fixed RandomGenerator:random crashing if a nil 'self' is used. * Fixed loading BMFont files which have characters with 0 width or height (a space character, for example). * Fixed love.graphics.newFont causing crashes if FileData is passed in. + * Fixed love.graphics.clear(colortable) causing crashes on OpenGL ES 2 systems when a Canvas is active. * Fixed a driver bug on some Android devices which caused all objects to show up as black. * Fixed a driver bug on Windows with AMD graphics cards where love.graphics.clear would not always work. * Fixed Shader:sendColor incorrectly converting alpha values from sRGB to linear RGB when gamma-correct rendering is enabled. diff --git a/src/modules/graphics/opengl/Graphics.cpp b/src/modules/graphics/opengl/Graphics.cpp index d4c3088f2..5ab7608e4 100644 --- a/src/modules/graphics/opengl/Graphics.cpp +++ b/src/modules/graphics/opengl/Graphics.cpp @@ -461,17 +461,23 @@ void Graphics::clear(const std::vector &colors) if (colors.size() == 0) return; - if (states.back().canvases.size() == 0) + size_t numcanvases = states.back().canvases.size(); + + if (numcanvases > 0 && colors.size() != numcanvases) + throw love::Exception("Number of clear colors must match the number of active canvases (%ld)", states.back().canvases.size()); + + // We want to take the single-color codepath if there's no active Canvas, or + // if there's only one active Canvas. The multi-color codepath (in the loop + // below) assumes MRT functions are available, and also may call more + // expensive GL functions which are unnecessary if only one Canvas is active. + if (numcanvases <= 1) { if (colors[0].enabled) - clear({colors[0].r, colors[0].g, colors[0].b, colors[0].a}); + clear(colors[0].toColor()); return; } - if (colors.size() != states.back().canvases.size()) - throw love::Exception("Number of clear colors must match the number of active canvases (%ld)", states.back().canvases.size()); - bool drawbuffermodified = false; for (int i = 0; i < (int) colors.size(); i++) diff --git a/src/modules/graphics/opengl/Graphics.h b/src/modules/graphics/opengl/Graphics.h index d602af78f..f1103354d 100644 --- a/src/modules/graphics/opengl/Graphics.h +++ b/src/modules/graphics/opengl/Graphics.h @@ -66,6 +66,8 @@ public: { float r, g, b, a; bool enabled; + + Colorf toColor() const { return Colorf(r, g, b, a); } }; Graphics();