Skip to content

Commit

Permalink
Fixed love.graphics.clear(colortable) causing crashes in GLES 2.0 whe…
Browse files Browse the repository at this point in the history
…n a Canvas is active (resolves issue #1127).
  • Loading branch information
slime73 committed Feb 14, 2016
1 parent 5923e2c commit f7ee949
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 5 deletions.
1 change: 1 addition & 0 deletions changes.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
16 changes: 11 additions & 5 deletions src/modules/graphics/opengl/Graphics.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -461,17 +461,23 @@ void Graphics::clear(const std::vector<OptionalColorf> &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++)
Expand Down
2 changes: 2 additions & 0 deletions src/modules/graphics/opengl/Graphics.h
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,8 @@ class Graphics : public love::graphics::Graphics
{
float r, g, b, a;
bool enabled;

Colorf toColor() const { return Colorf(r, g, b, a); }
};

Graphics();
Expand Down

0 comments on commit f7ee949

Please sign in to comment.