add (non-tested) impl of PBuffer

git-svn-id: https://sfml.svn.sourceforge.net/svnroot/sfml/branches/sfml2@1742 4e206d99-4929-0410-ac5d-dfc041789085
This commit is contained in:
mantognini 2010-12-03 22:49:13 +00:00
parent fd02b2d3af
commit 93cc2e4472
3 changed files with 117 additions and 31 deletions

View File

@ -117,7 +117,7 @@ if(BUILD_SHARED_LIBS)
endif() endif()
if(MACOSX) if(MACOSX)
# We use static version of freetype so we need to link against zlib. # We use static version of freetype so we need to link against zlib.
set(GRAPHICS_EXT_LIBS ${GRAPHICS_EXT_LIBS} z) set(GRAPHICS_EXT_LIBS ${GRAPHICS_EXT_LIBS} z "-framework AGL")
endif() endif()
endif() endif()

View File

@ -31,23 +31,42 @@
#include <SFML/Window/Context.hpp> #include <SFML/Window/Context.hpp>
#include <SFML/System/Err.hpp> #include <SFML/System/Err.hpp>
#warning RenderImageImplPBuffer not yet implemented
namespace sf namespace sf
{ {
namespace priv namespace priv
{ {
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
RenderImageImplPBuffer::RenderImageImplPBuffer() RenderImageImplPBuffer::RenderImageImplPBuffer() :
myPBuffer(NULL),
myContext(NULL),
myWidth (0),
myHeight (0)
{ {
/* TODO */ /* Nothing else */
} }
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
RenderImageImplPBuffer::~RenderImageImplPBuffer() RenderImageImplPBuffer::~RenderImageImplPBuffer()
{ {
/* TODO */
if (myPBuffer && aglDestroyPBuffer(myPBuffer) == GL_FALSE) {
sf::Err()
<< "An error occurs while destroying the PBuffer in "
<< __PRETTY_FUNCTION__
<< ". The error code is "
<< aglGetError()
<< std::endl;
}
if (myContext && aglDestroyContext(myContext) == GL_FALSE) {
sf::Err()
<< "An error occurs while destroying the context in "
<< __PRETTY_FUNCTION__
<< ". The error code is "
<< aglGetError()
<< std::endl;
}
// This is to make sure that another valid context is made // This is to make sure that another valid context is made
// active after we destroy the P-Buffer's one // active after we destroy the P-Buffer's one
@ -58,8 +77,10 @@ RenderImageImplPBuffer::~RenderImageImplPBuffer()
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
bool RenderImageImplPBuffer::IsSupported() bool RenderImageImplPBuffer::IsSupported()
{ {
/* TODO */ const GLubyte* strExt = glGetString(GL_EXTENSIONS);
return false; GLboolean isSupported = gluCheckExtension((const GLubyte*)"GL_APPLE_pixel_buffer", strExt);
return isSupported;
} }
@ -70,33 +91,95 @@ bool RenderImageImplPBuffer::Create(unsigned int width, unsigned int height, uns
myWidth = width; myWidth = width;
myHeight = height; myHeight = height;
/* TODO */ // Create the pixel format.
GLint attribs[] = {
return true; AGL_RGBA,
AGL_RED_SIZE, 8,
AGL_GREEN_SIZE, 8,
AGL_BLUE_SIZE, 8,
AGL_ALPHA_SIZE, 8,
AGL_DEPTH_SIZE, (depthBuffer ? 24 : 0),
0
};
AGLPixelFormat pf = aglChoosePixelFormat(NULL, 0, attribs);
if (!pf) {
sf::Err()
<< "Couldn't create the pixel format for the PBuffer."
<< std::endl;
return false;
}
// Create the context.
myContext = aglCreateContext(pf, NULL);
if (!myContext) {
sf::Err()
<< "Couldn't create the context for the PBuffer. (Error : "
<< aglGetError()
<< ")"
<< std::endl;
return false;
}
// Create the PBuffer.
GLboolean status = aglCreatePBuffer(myWidth, myHeight, GL_TEXTURE_RECTANGLE_EXT, GL_RGBA, 0, &myPBuffer);
if (status == GL_FALSE) {
sf::Err()
<< "Couldn't create the PBuffer. (Error : "
<< aglGetError()
<< ")"
<< std::endl;
return false;
}
// Set up the PBuffer with the context.
GLint screen = aglGetVirtualScreen(myContext);
if (screen == -1) {
sf::Err()
<< "Couldn't get the virtual screen of the context used with the PBuffer. (Error : "
<< aglGetError()
<< ")"
<< std::endl;
return false;
}
status = aglSetPBuffer(myContext, myPBuffer, 0, 0, screen);
if (status == GL_FALSE) {
sf::Err()
<< "Couldn't set up the PBuffer with the context. (Error : "
<< aglGetError()
<< ")"
<< std::endl;
return false;
}
return true;
} }
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
bool RenderImageImplPBuffer::Activate(bool active) bool RenderImageImplPBuffer::Activate(bool active)
{ {
if (active) if (active) {
{ if (!myContext || !myPBuffer) { // Not created yet.
if (false/*myPBuffer && myContext*/) return false;
{ }
// try to activate
} if (aglGetCurrentContext() == myContext) {
else return true;
{ } else {
return false; return aglSetCurrentContext(myContext);
} }
} } else {
else // To deactivate the P-Buffer's context, we actually activate
{ // another one so that we make sure that there is always an
// To deactivate the P-Buffer's context, we actually activate // active context for subsequent graphics operations
// another one so that we make sure that there is always an return Context::SetReferenceActive();
// active context for subsequent graphics operations }
return Context::SetReferenceActive();
}
} }

View File

@ -30,14 +30,15 @@
// Headers // Headers
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
#include <SFML/Graphics/RenderImageImpl.hpp> #include <SFML/Graphics/RenderImageImpl.hpp>
#include <GL/glew.h>
#include <AGL/agl.h>
namespace sf namespace sf
{ {
namespace priv namespace priv
{ {
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
/// \brief Specialization of RenderImageImpl using ****** P-Buffers /// \brief Specialization of RenderImageImpl using AGL P-Buffers
/// ///
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
class RenderImageImplPBuffer : public RenderImageImpl class RenderImageImplPBuffer : public RenderImageImpl
@ -100,6 +101,8 @@ private :
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
// Member data // Member data
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
AGLPbuffer myPBuffer; ///< P-Buffer
AGLContext myContext; ///< Associated OpenGL context
unsigned int myWidth; ///< Width of the P-Buffer unsigned int myWidth; ///< Width of the P-Buffer
unsigned int myHeight; ///< Height of the P-Buffer unsigned int myHeight; ///< Height of the P-Buffer
}; };