mirror of
https://github.com/love2d/love.git
synced 2026-08-19 12:14:20 +02:00
Fixed lazy-loading of stencil buffers in Canvases sometimes failing due to uninitialized variables
This commit is contained in:
@@ -2188,6 +2188,7 @@
|
|||||||
/Library/Frameworks/Lua.framework/Headers,
|
/Library/Frameworks/Lua.framework/Headers,
|
||||||
/Library/Frameworks/SDL.framework/Headers,
|
/Library/Frameworks/SDL.framework/Headers,
|
||||||
);
|
);
|
||||||
|
LD_RUNPATH_SEARCH_PATHS = "@rpath";
|
||||||
LIBRARY_SEARCH_PATHS = "";
|
LIBRARY_SEARCH_PATHS = "";
|
||||||
MACOSX_DEPLOYMENT_TARGET = 10.5;
|
MACOSX_DEPLOYMENT_TARGET = 10.5;
|
||||||
ONLY_ACTIVE_ARCH = NO;
|
ONLY_ACTIVE_ARCH = NO;
|
||||||
@@ -2220,6 +2221,7 @@
|
|||||||
/Library/Frameworks/Lua.framework/Headers,
|
/Library/Frameworks/Lua.framework/Headers,
|
||||||
/Library/Frameworks/SDL.framework/Headers,
|
/Library/Frameworks/SDL.framework/Headers,
|
||||||
);
|
);
|
||||||
|
LD_RUNPATH_SEARCH_PATHS = "@rpath";
|
||||||
LIBRARY_SEARCH_PATHS = "";
|
LIBRARY_SEARCH_PATHS = "";
|
||||||
MACOSX_DEPLOYMENT_TARGET = 10.5;
|
MACOSX_DEPLOYMENT_TARGET = 10.5;
|
||||||
ONLY_ACTIVE_ARCH = YES;
|
ONLY_ACTIVE_ARCH = YES;
|
||||||
@@ -2242,7 +2244,6 @@
|
|||||||
);
|
);
|
||||||
INFOPLIST_FILE = "Info-Framework.plist";
|
INFOPLIST_FILE = "Info-Framework.plist";
|
||||||
LD_DYLIB_INSTALL_NAME = "@rpath/$(EXECUTABLE_PATH)";
|
LD_DYLIB_INSTALL_NAME = "@rpath/$(EXECUTABLE_PATH)";
|
||||||
LD_RUNPATH_SEARCH_PATHS = "@executable_path/../Frameworks";
|
|
||||||
PRODUCT_NAME = love;
|
PRODUCT_NAME = love;
|
||||||
SKIP_INSTALL = YES;
|
SKIP_INSTALL = YES;
|
||||||
WRAPPER_EXTENSION = framework;
|
WRAPPER_EXTENSION = framework;
|
||||||
@@ -2260,7 +2261,6 @@
|
|||||||
GCC_ENABLE_OBJC_EXCEPTIONS = YES;
|
GCC_ENABLE_OBJC_EXCEPTIONS = YES;
|
||||||
INFOPLIST_FILE = "Info-Framework.plist";
|
INFOPLIST_FILE = "Info-Framework.plist";
|
||||||
LD_DYLIB_INSTALL_NAME = "@rpath/$(EXECUTABLE_PATH)";
|
LD_DYLIB_INSTALL_NAME = "@rpath/$(EXECUTABLE_PATH)";
|
||||||
LD_RUNPATH_SEARCH_PATHS = "@executable_path/../Frameworks";
|
|
||||||
PRODUCT_NAME = love;
|
PRODUCT_NAME = love;
|
||||||
SKIP_INSTALL = YES;
|
SKIP_INSTALL = YES;
|
||||||
WRAPPER_EXTENSION = framework;
|
WRAPPER_EXTENSION = framework;
|
||||||
|
|||||||
@@ -350,7 +350,7 @@
|
|||||||
/Library/Frameworks/SDL.framework/Headers,
|
/Library/Frameworks/SDL.framework/Headers,
|
||||||
);
|
);
|
||||||
INFOPLIST_FILE = "love-Info.plist";
|
INFOPLIST_FILE = "love-Info.plist";
|
||||||
LD_RUNPATH_SEARCH_PATHS = "@loader_path/../Frameworks @loader_path/../Libraries";
|
LD_RUNPATH_SEARCH_PATHS = "@loader_path/../Frameworks";
|
||||||
MACOSX_DEPLOYMENT_TARGET = 10.5;
|
MACOSX_DEPLOYMENT_TARGET = 10.5;
|
||||||
ONLY_ACTIVE_ARCH = YES;
|
ONLY_ACTIVE_ARCH = YES;
|
||||||
OTHER_LDFLAGS = "";
|
OTHER_LDFLAGS = "";
|
||||||
@@ -404,7 +404,7 @@
|
|||||||
/Library/Frameworks/SDL.framework/Headers,
|
/Library/Frameworks/SDL.framework/Headers,
|
||||||
);
|
);
|
||||||
INFOPLIST_FILE = "love-Info.plist";
|
INFOPLIST_FILE = "love-Info.plist";
|
||||||
LD_RUNPATH_SEARCH_PATHS = "@loader_path/../Frameworks @loader_path/../Libraries";
|
LD_RUNPATH_SEARCH_PATHS = "@loader_path/../Frameworks";
|
||||||
LLVM_LTO = YES;
|
LLVM_LTO = YES;
|
||||||
MACOSX_DEPLOYMENT_TARGET = 10.5;
|
MACOSX_DEPLOYMENT_TARGET = 10.5;
|
||||||
ONLY_ACTIVE_ARCH = NO;
|
ONLY_ACTIVE_ARCH = NO;
|
||||||
|
|||||||
@@ -139,9 +139,7 @@ struct FramebufferStrategyGL3 : public FramebufferStrategy
|
|||||||
glBindRenderbuffer(GL_RENDERBUFFER, stencil);
|
glBindRenderbuffer(GL_RENDERBUFFER, stencil);
|
||||||
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_STENCIL, width, height);
|
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_STENCIL, width, height);
|
||||||
|
|
||||||
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT,
|
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT,
|
||||||
GL_RENDERBUFFER, stencil);
|
|
||||||
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
|
|
||||||
GL_RENDERBUFFER, stencil);
|
GL_RENDERBUFFER, stencil);
|
||||||
|
|
||||||
glBindRenderbuffer(GL_RENDERBUFFER, 0);
|
glBindRenderbuffer(GL_RENDERBUFFER, 0);
|
||||||
@@ -153,8 +151,10 @@ struct FramebufferStrategyGL3 : public FramebufferStrategy
|
|||||||
virtual void deleteFBO(GLuint framebuffer, GLuint depth_stencil, GLuint img)
|
virtual void deleteFBO(GLuint framebuffer, GLuint depth_stencil, GLuint img)
|
||||||
{
|
{
|
||||||
gl.deleteTexture(img);
|
gl.deleteTexture(img);
|
||||||
glDeleteRenderbuffers(1, &depth_stencil);
|
if (depth_stencil != 0)
|
||||||
glDeleteFramebuffers(1, &framebuffer);
|
glDeleteRenderbuffers(1, &depth_stencil);
|
||||||
|
if (framebuffer != 0)
|
||||||
|
glDeleteFramebuffers(1, &framebuffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void bindFBO(GLuint framebuffer)
|
virtual void bindFBO(GLuint framebuffer)
|
||||||
@@ -192,8 +192,6 @@ struct FramebufferStrategyGL3 : public FramebufferStrategy
|
|||||||
glDrawBuffers(drawbuffers.size(), &drawbuffers[0]);
|
glDrawBuffers(drawbuffers.size(), &drawbuffers[0]);
|
||||||
else if (GLEE_ARB_draw_buffers)
|
else if (GLEE_ARB_draw_buffers)
|
||||||
glDrawBuffersARB(drawbuffers.size(), &drawbuffers[0]);
|
glDrawBuffersARB(drawbuffers.size(), &drawbuffers[0]);
|
||||||
else if (GLEE_ATI_draw_buffers)
|
|
||||||
glDrawBuffersATI(drawbuffers.size(), &drawbuffers[0]);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -252,8 +250,6 @@ struct FramebufferStrategyPackedEXT : public FramebufferStrategy
|
|||||||
width, height);
|
width, height);
|
||||||
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT,
|
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT,
|
||||||
GL_RENDERBUFFER_EXT, stencil);
|
GL_RENDERBUFFER_EXT, stencil);
|
||||||
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT,
|
|
||||||
GL_RENDERBUFFER_EXT, stencil);
|
|
||||||
|
|
||||||
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0);
|
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0);
|
||||||
|
|
||||||
@@ -264,8 +260,10 @@ struct FramebufferStrategyPackedEXT : public FramebufferStrategy
|
|||||||
virtual void deleteFBO(GLuint framebuffer, GLuint depth_stencil, GLuint img)
|
virtual void deleteFBO(GLuint framebuffer, GLuint depth_stencil, GLuint img)
|
||||||
{
|
{
|
||||||
gl.deleteTexture(img);
|
gl.deleteTexture(img);
|
||||||
glDeleteRenderbuffersEXT(1, &depth_stencil);
|
if (depth_stencil != 0)
|
||||||
glDeleteFramebuffersEXT(1, &framebuffer);
|
glDeleteRenderbuffersEXT(1, &depth_stencil);
|
||||||
|
if (framebuffer != 0)
|
||||||
|
glDeleteFramebuffersEXT(1, &framebuffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void bindFBO(GLuint framebuffer)
|
virtual void bindFBO(GLuint framebuffer)
|
||||||
@@ -303,8 +301,6 @@ struct FramebufferStrategyPackedEXT : public FramebufferStrategy
|
|||||||
glDrawBuffers(drawbuffers.size(), &drawbuffers[0]);
|
glDrawBuffers(drawbuffers.size(), &drawbuffers[0]);
|
||||||
else if (GLEE_ARB_draw_buffers)
|
else if (GLEE_ARB_draw_buffers)
|
||||||
glDrawBuffersARB(drawbuffers.size(), &drawbuffers[0]);
|
glDrawBuffersARB(drawbuffers.size(), &drawbuffers[0]);
|
||||||
else if (GLEE_ATI_draw_buffers)
|
|
||||||
glDrawBuffersATI(drawbuffers.size(), &drawbuffers[0]);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -369,6 +365,9 @@ static int maxDrawBuffers = 0;
|
|||||||
Canvas::Canvas(int width, int height, TextureType texture_type)
|
Canvas::Canvas(int width, int height, TextureType texture_type)
|
||||||
: width(width)
|
: width(width)
|
||||||
, height(height)
|
, height(height)
|
||||||
|
, fbo(0)
|
||||||
|
, depth_stencil(0)
|
||||||
|
, img(0)
|
||||||
, texture_type(texture_type)
|
, texture_type(texture_type)
|
||||||
{
|
{
|
||||||
float w = static_cast<float>(width);
|
float w = static_cast<float>(width);
|
||||||
@@ -423,7 +422,7 @@ bool Canvas::isHDRSupported()
|
|||||||
|
|
||||||
bool Canvas::isMultiCanvasSupported()
|
bool Canvas::isMultiCanvasSupported()
|
||||||
{
|
{
|
||||||
if (!(isSupported() && (GLEE_VERSION_2_0 || GLEE_ARB_draw_buffers || GLEE_ATI_draw_buffers)))
|
if (!(isSupported() && (GLEE_VERSION_2_0 || GLEE_ARB_draw_buffers)))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (maxFBOColorAttachments == 0 || maxDrawBuffers == 0)
|
if (maxFBOColorAttachments == 0 || maxDrawBuffers == 0)
|
||||||
@@ -548,8 +547,11 @@ void Canvas::stopGrab()
|
|||||||
current = NULL;
|
current = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Canvas::clear(const Color &c)
|
void Canvas::clear(Color c)
|
||||||
{
|
{
|
||||||
|
if (strategy == &strategyNone)
|
||||||
|
return;
|
||||||
|
|
||||||
GLuint previous = 0;
|
GLuint previous = 0;
|
||||||
|
|
||||||
if (current != this)
|
if (current != this)
|
||||||
@@ -717,8 +719,9 @@ const std::vector<Canvas *> &Canvas::getAttachedCanvases() const
|
|||||||
|
|
||||||
void Canvas::setFilter(const Image::Filter &f)
|
void Canvas::setFilter(const Image::Filter &f)
|
||||||
{
|
{
|
||||||
|
settings.filter = f;
|
||||||
gl.bindTexture(img);
|
gl.bindTexture(img);
|
||||||
gl.setTextureFilter(f);
|
settings.filter.anisotropy = gl.setTextureFilter(f);
|
||||||
}
|
}
|
||||||
|
|
||||||
Image::Filter Canvas::getFilter() const
|
Image::Filter Canvas::getFilter() const
|
||||||
@@ -729,21 +732,24 @@ Image::Filter Canvas::getFilter() const
|
|||||||
|
|
||||||
void Canvas::setWrap(const Image::Wrap &w)
|
void Canvas::setWrap(const Image::Wrap &w)
|
||||||
{
|
{
|
||||||
|
settings.wrap = w;
|
||||||
gl.bindTexture(img);
|
gl.bindTexture(img);
|
||||||
gl.setTextureWrap(w);
|
gl.setTextureWrap(w);
|
||||||
}
|
}
|
||||||
|
|
||||||
Image::Wrap Canvas::getWrap() const
|
Image::Wrap Canvas::getWrap() const
|
||||||
{
|
{
|
||||||
gl.bindTexture(img);
|
return settings.wrap;
|
||||||
return gl.getTextureWrap();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Canvas::loadVolatile()
|
bool Canvas::loadVolatile()
|
||||||
{
|
{
|
||||||
// glTexImage2D is guaranteed to error in this case.
|
// glTexImage2D is guaranteed to error in this case.
|
||||||
if (width > gl.getMaxTextureSize() || height > gl.getMaxTextureSize())
|
if (width > gl.getMaxTextureSize() || height > gl.getMaxTextureSize())
|
||||||
|
{
|
||||||
|
status = GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
status = strategy->createFBO(fbo, img, width, height, texture_type);
|
status = strategy->createFBO(fbo, img, width, height, texture_type);
|
||||||
if (status != GL_FRAMEBUFFER_COMPLETE)
|
if (status != GL_FRAMEBUFFER_COMPLETE)
|
||||||
@@ -751,15 +757,12 @@ bool Canvas::loadVolatile()
|
|||||||
|
|
||||||
setFilter(settings.filter);
|
setFilter(settings.filter);
|
||||||
setWrap(settings.wrap);
|
setWrap(settings.wrap);
|
||||||
Color c(0, 0, 0, 0);
|
clear(Color(0, 0, 0, 0));
|
||||||
clear(c);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Canvas::unloadVolatile()
|
void Canvas::unloadVolatile()
|
||||||
{
|
{
|
||||||
settings.filter = getFilter();
|
|
||||||
settings.wrap = getWrap();
|
|
||||||
strategy->deleteFBO(fbo, depth_stencil, img);
|
strategy->deleteFBO(fbo, depth_stencil, img);
|
||||||
|
|
||||||
for (size_t i = 0; i < attachedCanvases.size(); i++)
|
for (size_t i = 0; i < attachedCanvases.size(); i++)
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ public:
|
|||||||
void startGrab();
|
void startGrab();
|
||||||
void stopGrab();
|
void stopGrab();
|
||||||
|
|
||||||
void clear(const Color &c);
|
void clear(Color c);
|
||||||
|
|
||||||
virtual void draw(float x, float y, float angle, float sx, float sy, float ox, float oy, float kx, float ky) const;
|
virtual void draw(float x, float y, float angle, float sx, float sy, float ox, float oy, float kx, float ky) const;
|
||||||
|
|
||||||
@@ -80,7 +80,7 @@ public:
|
|||||||
|
|
||||||
const std::vector<Canvas *> &getAttachedCanvases() const;
|
const std::vector<Canvas *> &getAttachedCanvases() const;
|
||||||
|
|
||||||
void setFilter(const Image::Filter &f);
|
void setFilter(const Image::Filter &f);
|
||||||
Image::Filter getFilter() const;
|
Image::Filter getFilter() const;
|
||||||
|
|
||||||
void setWrap(const Image::Wrap &w);
|
void setWrap(const Image::Wrap &w);
|
||||||
@@ -89,12 +89,12 @@ void setFilter(const Image::Filter &f);
|
|||||||
int getWidth();
|
int getWidth();
|
||||||
int getHeight();
|
int getHeight();
|
||||||
|
|
||||||
unsigned int getStatus() const
|
inline GLenum getStatus() const
|
||||||
{
|
{
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
TextureType getTextureType() const
|
inline TextureType getTextureType() const
|
||||||
{
|
{
|
||||||
return texture_type;
|
return texture_type;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user