@ -46,16 +46,16 @@ Renderbuffer depthStencil;
// configure the textures and allocate texture memory...
// configure the textures and allocate texture memory...
framebuffer . attachTexture2D ( 0 , & color ) ;
framebuffer . attachTexture2D ( Framebuffer : : ColorAttachment ( 0 ) , & color ) ;
framebuffer . attachTexture2D ( 1 , & normal ) ;
framebuffer . attachTexture2D ( Framebuffer : : ColorAttachment ( 1 ) , & normal ) ;
framebuffer . attachRenderbuffer ( Framebuffer : : DepthStencil Attachment: : DepthStencil , & depthStencil ) ;
framebuffer . attachRenderbuffer ( Framebuffer : : Buffer Attachment: : DepthStencil , & depthStencil ) ;
@ endcode
@ endcode
Then you need to map outputs of your shader to color attachments in the
Then you need to map outputs of your shader to color attachments in the
framebuffer :
framebuffer :
@ code
@ code
framebuffer . mapForDraw ( { { MyShader : : ColorOutput , 0 } ,
framebuffer . mapForDraw ( { { MyShader : : ColorOutput , Framebuffer : : ColorAttachment ( 0 ) } ,
{ MyShader : : NormalOutput , 1 } } ) ;
{ MyShader : : NormalOutput , Framebuffer : : ColorAttachment ( 1 ) } } ) ;
@ endcode
@ endcode
The actual @ ref Platform : : GlutApplication : : drawEvent ( ) " drawEvent() " might
The actual @ ref Platform : : GlutApplication : : drawEvent ( ) " drawEvent() " might
@ -64,13 +64,13 @@ off-screen framebuffer, then bind the default and render the textures on
screen :
screen :
@ code
@ code
void drawEvent ( ) {
void drawEvent ( ) {
defaultFramebuffer . clear ( Abstrac tFramebuffer: : Clear : : Color )
defaultFramebuffer . clear ( Defaul tFramebuffer: : Clear : : Color )
framebuffer . clear ( Abstract Framebuffer: : Clear : : Color | Abstract Framebuffer: : Clear : : Depth | Abstract Framebuffer: : Clear : : Stencil ) ;
framebuffer . clear ( Framebuffer : : Clear : : Color | Framebuffer : : Clear : : Depth | Framebuffer : : Clear : : Stencil ) ;
framebuffer . bind ( Abstract Framebuffer: : Target : : Draw ) ;
framebuffer . bind ( Framebuffer : : Target : : Draw ) ;
// ...
// ...
defaultFramebuffer . bind ( Abstrac tFramebuffer: : Target : : Draw ) ;
defaultFramebuffer . bind ( Defaul tFramebuffer: : Target : : Draw ) ;
// ...
// ...
}
}
@ endcode
@ endcode
@ -91,6 +91,90 @@ class MAGNUM_EXPORT Framebuffer: public AbstractFramebuffer {
friend class Context ;
friend class Context ;
public :
public :
/**
* @ brief Color attachment
*
* @ see Attachment , attachRenderbuffer ( ) , attachTexture1D ( ) ,
* attachTexture2D ( ) , attachCubeMapTexture ( ) , attachTexture3D ( )
*/
class ColorAttachment {
friend class Framebuffer ;
public :
/**
* @ brief Constructor
* @ param id Color attachment id
*/
inline constexpr explicit ColorAttachment ( std : : uint8_t id ) : attachment ( GL_COLOR_ATTACHMENT0 + id ) { }
# ifndef DOXYGEN_GENERATING_OUTPUT
inline constexpr explicit operator GLenum ( ) const { return attachment ; }
# endif
private :
GLenum attachment ;
} ;
/**
* @ brief Draw attachment
*
* @ see mapForDraw ( )
*/
class DrawAttachment {
public :
/** @brief No attachment */
static const DrawAttachment None ;
/** @brief Color attachment */
inline constexpr /*implicit*/ DrawAttachment ( Framebuffer : : ColorAttachment attachment ) : attachment ( GLenum ( attachment ) ) { }
# ifndef DOXYGEN_GENERATING_OUTPUT
inline constexpr explicit operator GLenum ( ) const { return attachment ; }
# endif
private :
inline constexpr explicit DrawAttachment ( GLenum attachment ) : attachment ( attachment ) { }
GLenum attachment ;
} ;
/**
* @ brief % Buffer attachment
*
* @ see attachRenderbuffer ( ) , attachTexture1D ( ) , attachTexture2D ( ) ,
* attachCubeMapTexture ( ) , attachTexture3D ( )
*/
class BufferAttachment {
public :
/** @brief Depth buffer */
static const BufferAttachment Depth ;
/** @brief Stencil buffer */
static const BufferAttachment Stencil ;
# ifndef MAGNUM_TARGET_GLES2
/**
* @ brief Both depth and stencil buffer
*
* @ requires_gles30 Combined depth and stencil attachment is
* not available in OpenGL ES 2.0 .
*/
static const BufferAttachment DepthStencil ;
# endif
/** @brief Color buffer */
inline constexpr /*implicit*/ BufferAttachment ( Framebuffer : : ColorAttachment attachment ) : attachment ( GLenum ( attachment ) ) { }
# ifndef DOXYGEN_GENERATING_OUTPUT
inline constexpr explicit operator GLenum ( ) const { return attachment ; }
# endif
private :
inline constexpr explicit BufferAttachment ( GLenum attachment ) : attachment ( attachment ) { }
GLenum attachment ;
} ;
/**
/**
* @ brief Constructor
* @ brief Constructor
*
*
@ -108,15 +192,15 @@ class MAGNUM_EXPORT Framebuffer: public AbstractFramebuffer {
~ Framebuffer ( ) ;
~ Framebuffer ( ) ;
/**
/**
* @ brief Map shader output to color attachment
* @ brief Map shader output to attachments
*
*
* @ p attachments is list of shader outputs mapped to framebuffer
* @ p attachments is list of shader outputs mapped to framebuffer
* color attachment IDs . Shader outputs which are not listed are not
* color attachment IDs . % Shader outputs which are not listed are not
* used , you can achieve the same by passing ` - 1 ` as color attachment
* used , you can achieve the same by passing Framebuffer : : DrawAttachment : : None
* ID . Example usage :
* as color attachment ID . Example usage :
* @ code
* @ code
* framebuffer . mapForDraw ( { { MyShader : : ColorOutput , 0 } ,
* framebuffer . mapForDraw ( { { MyShader : : ColorOutput , Framebuffer : : ColorAttachment ( 0 ) } ,
* { MyShader : : NormalOutput , 1 } } ) ;
* { MyShader : : NormalOutput , Framebuffer : : DrawAttachment : : None } } ) ;
* @ endcode
* @ endcode
*
*
* If @ extension { EXT , direct_state_access } is not available and the
* If @ extension { EXT , direct_state_access } is not available and the
@ -126,11 +210,11 @@ class MAGNUM_EXPORT Framebuffer: public AbstractFramebuffer {
* @ fn_gl_extension { FramebufferDrawBuffers , EXT , direct_state_access }
* @ fn_gl_extension { FramebufferDrawBuffers , EXT , direct_state_access }
* @ requires_gles30 % Extension @ es_extension2 { NV , draw_buffers , GL_NV_draw_buffers }
* @ requires_gles30 % Extension @ es_extension2 { NV , draw_buffers , GL_NV_draw_buffers }
*/
*/
void mapForDraw ( std : : initializer_list < std : : pair < GLuint , std : : int8_ t> > attachments ) ;
void mapForDraw ( std : : initializer_list < std : : pair < GLuint , DrawAttachmen t> > attachments ) ;
/**
/**
* @ brief Map shader output to color attachment
* @ brief Map shader output to attachment
* @ param attachment Color attachment ID
* @ param attachment Draw attachment
*
*
* Similar to above function , can be used in cases when shader has
* Similar to above function , can be used in cases when shader has
* only one ( unnamed ) output .
* only one ( unnamed ) output .
@ -142,13 +226,13 @@ class MAGNUM_EXPORT Framebuffer: public AbstractFramebuffer {
* @ fn_gl_extension { FramebufferDrawBuffer , EXT , direct_state_access }
* @ fn_gl_extension { FramebufferDrawBuffer , EXT , direct_state_access }
* @ requires_gles30 % Extension @ es_extension2 { NV , draw_buffers , GL_NV_draw_buffers }
* @ requires_gles30 % Extension @ es_extension2 { NV , draw_buffers , GL_NV_draw_buffers }
*/
*/
inline void mapForDraw ( std : : int8_ t attachment ) {
inline void mapForDraw ( DrawAttachmen t attachment ) {
( this - > * drawBufferImplementation ) ( static_cast < GLenum > ( GL_COLOR_ATTACHMENT0 + attachment ) ) ;
( this - > * drawBufferImplementation ) ( GLenum ( attachment ) ) ;
}
}
/**
/**
* @ brief Map given color attachment for reading
* @ brief Map given color attachment for reading
* @ param attachment Color attachment ID
* @ param attachment Color attachment
*
*
* If @ extension { EXT , direct_state_access } is not available and the
* If @ extension { EXT , direct_state_access } is not available and the
* framebufferbuffer is not currently bound , it is bound before the
* framebufferbuffer is not currently bound , it is bound before the
@ -157,35 +241,13 @@ class MAGNUM_EXPORT Framebuffer: public AbstractFramebuffer {
* @ fn_gl_extension { FramebufferReadBuffer , EXT , direct_state_access }
* @ fn_gl_extension { FramebufferReadBuffer , EXT , direct_state_access }
* @ requires_gles30 % Extension @ es_extension2 { NV , read_buffer , GL_NV_read_buffer }
* @ requires_gles30 % Extension @ es_extension2 { NV , read_buffer , GL_NV_read_buffer }
*/
*/
inline void mapForRead ( std : : uint8_ t attachment ) {
inline void mapForRead ( ColorAttachmen t attachment ) {
( this - > * readBufferImplementation ) ( GL_COLOR_ATTACHMENT0 + attachment ) ;
( this - > * readBufferImplementation ) ( GLenum ( attachment ) ) ;
}
}
/**
/**
* @ brief Attachment for depth / stencil part of fragment shader output
* @ brief Attach renderbuffer to given buffer
*
* @ param attachment % Buffer attachment
* @ see attachRenderbuffer ( ) , attachTexture1D ( ) , attachTexture2D ( ) ,
* attachCubeMapTexture ( ) , attachTexture3D ( )
*/
enum class DepthStencilAttachment : GLenum {
Depth = GL_DEPTH_ATTACHMENT , /**< Depth output only. */
Stencil = GL_STENCIL_ATTACHMENT /**< Stencil output only. */
# ifndef MAGNUM_TARGET_GLES2
,
/**
* Both depth and stencil output .
* @ requires_gles30 Combined depth and stencil attachment is not
* available in OpenGL ES 2.0 .
*/
DepthStencil = GL_DEPTH_STENCIL_ATTACHMENT
# endif
} ;
/**
* @ brief Attach renderbuffer to given framebuffer depth / stencil attachment
* @ param depthStencilAttachment Depth / stencil attachment
* @ param renderbuffer % Renderbuffer
* @ param renderbuffer % Renderbuffer
*
*
* If @ extension { EXT , direct_state_access } is not available and the
* If @ extension { EXT , direct_state_access } is not available and the
@ -194,48 +256,16 @@ class MAGNUM_EXPORT Framebuffer: public AbstractFramebuffer {
* @ see @ fn_gl { BindFramebuffer } , @ fn_gl { FramebufferRenderbuffer } or
* @ see @ fn_gl { BindFramebuffer } , @ fn_gl { FramebufferRenderbuffer } or
* @ fn_gl_extension { NamedFramebufferRenderbuffer , EXT , direct_state_access }
* @ fn_gl_extension { NamedFramebufferRenderbuffer , EXT , direct_state_access }
*/
*/
inline void attachRenderbuffer ( DepthStencilAttachment depthStencilAttachment , Renderbuffer * renderbuffer ) {
inline void attachRenderbuffer ( BufferAttachment attachment , Renderbuffer * renderbuffer ) {
( this - > * renderbufferImplementation ) ( GLenum ( depthStencilAttachment ) , renderbuffer ) ;
( this - > * renderbufferImplementation ) ( attachment , renderbuffer ) ;
}
/**
* @ brief Attach renderbuffer to given framebuffer color attachment
* @ param colorAttachment Color attachment ID ( number between 0 and 15 )
* @ param renderbuffer % Renderbuffer
*
* If @ extension { EXT , direct_state_access } is not available and the
* framebufferbuffer is not currently bound , it is bound before the
* operation .
* @ see @ fn_gl { BindFramebuffer } , @ fn_gl { FramebufferRenderbuffer } or
* @ fn_gl_extension { NamedFramebufferRenderbuffer , EXT , direct_state_access }
*/
inline void attachRenderbuffer ( std : : uint8_t colorAttachment , Renderbuffer * renderbuffer ) {
( this - > * renderbufferImplementation ) ( GL_COLOR_ATTACHMENT0 + colorAttachment , renderbuffer ) ;
}
}
# ifndef MAGNUM_TARGET_GLES
# ifndef MAGNUM_TARGET_GLES
/**
/**
* @ brief Attach 1 D texture to given framebuffer depth / stencil attachment
* @ brief Attach 1 D texture to given buffer
* @ param depthStencilAttachment Depth / stencil attachment
* @ param attachment % Buffer attachment
* @ param texture 1 D texture
* @ param mipLevel Mip level
*
* If @ extension { EXT , direct_state_access } is not available and the
* framebufferbuffer is not currently bound , it is bound before the
* operation .
* @ see @ fn_gl { BindFramebuffer } , @ fn_gl { FramebufferTexture } or
* @ fn_gl_extension { NamedFramebufferTexture1D , EXT , direct_state_access }
* @ requires_gl Only 2 D and 3 D textures are available in OpenGL ES .
*/
inline void attachTexture1D ( DepthStencilAttachment depthStencilAttachment , Texture1D * texture , GLint mipLevel ) {
( this - > * texture1DImplementation ) ( GLenum ( depthStencilAttachment ) , texture , mipLevel ) ;
}
/**
* @ brief Attach 1 D texture to given framebuffer color attachment
* @ param colorAttachment Color attachment ID ( number between 0 and 15 )
* @ param texture 1 D texture
* @ param texture 1 D texture
* @ param mipLevel Mip level
* @ param level Mip level
*
*
* If @ extension { EXT , direct_state_access } is not available and the
* If @ extension { EXT , direct_state_access } is not available and the
* framebufferbuffer is not currently bound , it is bound before the
* framebufferbuffer is not currently bound , it is bound before the
@ -244,32 +274,16 @@ class MAGNUM_EXPORT Framebuffer: public AbstractFramebuffer {
* @ fn_gl_extension { NamedFramebufferTexture1D , EXT , direct_state_access }
* @ fn_gl_extension { NamedFramebufferTexture1D , EXT , direct_state_access }
* @ requires_gl Only 2 D and 3 D textures are available in OpenGL ES .
* @ requires_gl Only 2 D and 3 D textures are available in OpenGL ES .
*/
*/
inline void attachTexture1D ( std : : uint8_t colorA ttachment, Texture1D * texture , GLint mipL evel) {
inline void attachTexture1D ( BufferAttachment a ttachment, Texture1D * texture , GLint l evel) {
( this - > * texture1DImplementation ) ( GL_COLOR_ATTACHMENT0 + colorA ttachment, texture , mipL evel) ;
( this - > * texture1DImplementation ) ( a ttachment, texture , l evel) ;
}
}
# endif
# endif
/**
/**
* @ brief Attach 2 D texture to given framebuffer depth / stencil attachment
* @ brief Attach 2 D texture to given buffer
* @ param depthStencilAttachment Depth / stencil attachment
* @ param attachment % Buffer attachment
* @ param texture 2 D texture
* @ param mipLevel Mip level . For rectangle textures it
* should be always 0.
*
* If @ extension { EXT , direct_state_access } is not available and the
* framebufferbuffer is not currently bound , it is bound before the
* operation .
* @ see attachCubeMapTexture ( ) , @ fn_gl { BindFramebuffer } , @ fn_gl { FramebufferTexture }
* or @ fn_gl_extension { NamedFramebufferTexture2D , EXT , direct_state_access }
*/
void attachTexture2D ( DepthStencilAttachment depthStencilAttachment , Texture2D * texture , GLint mipLevel ) ;
/**
* @ brief Attach 2 D texture to given framebuffer color attachment
* @ param colorAttachment Color attachment ID ( number between 0 and 15 )
* @ param texture 2 D texture
* @ param texture 2 D texture
* @ param mipLevel Mip level . For rectangle textures it
* @ param level Mip level
* should be always 0.
*
*
* If @ extension { EXT , direct_state_access } is not available and the
* If @ extension { EXT , direct_state_access } is not available and the
* framebufferbuffer is not currently bound , it is bound before the
* framebufferbuffer is not currently bound , it is bound before the
@ -277,14 +291,14 @@ class MAGNUM_EXPORT Framebuffer: public AbstractFramebuffer {
* @ see attachCubeMapTexture ( ) , @ fn_gl { BindFramebuffer } , @ fn_gl { FramebufferTexture }
* @ see attachCubeMapTexture ( ) , @ fn_gl { BindFramebuffer } , @ fn_gl { FramebufferTexture }
* or @ fn_gl_extension { NamedFramebufferTexture2D , EXT , direct_state_access }
* or @ fn_gl_extension { NamedFramebufferTexture2D , EXT , direct_state_access }
*/
*/
void attachTexture2D ( std : : uint8_t colorA ttachment, Texture2D * texture , GLint mipL evel) ;
void attachTexture2D ( BufferAttachment a ttachment, Texture2D * texture , GLint l evel) ;
/**
/**
* @ brief Attach cube map texture to given frame buffer depth / stencil attachment
* @ brief Attach cube map texture to given buffer
* @ param depthStencilAttachment Depth / stencil attachment
* @ param attachment % Buffer attachment
* @ param texture Cube map texture
* @ param texture Cube map texture
* @ param coordinate Cube map coordinate
* @ param coordinate Cube map coordinate
* @ param mipLevel Mip level
* @ param level Mip level
*
*
* If @ extension { EXT , direct_state_access } is not available and the
* If @ extension { EXT , direct_state_access } is not available and the
* framebufferbuffer is not currently bound , it is bound before the
* framebufferbuffer is not currently bound , it is bound before the
@ -292,32 +306,15 @@ class MAGNUM_EXPORT Framebuffer: public AbstractFramebuffer {
* @ see attachTexture2D ( ) , @ fn_gl { BindFramebuffer } , @ fn_gl { FramebufferTexture }
* @ see attachTexture2D ( ) , @ fn_gl { BindFramebuffer } , @ fn_gl { FramebufferTexture }
* or @ fn_gl_extension { NamedFramebufferTexture2D , EXT , direct_state_access }
* or @ fn_gl_extension { NamedFramebufferTexture2D , EXT , direct_state_access }
*/
*/
inline void attachCubeMapTexture ( DepthStencilAttachment depthStencilA ttachment, CubeMapTexture * texture , CubeMapTexture : : Coordinate coordinate , GLint mipL evel) {
inline void attachCubeMapTexture ( BufferAttachment a ttachment, CubeMapTexture * texture , CubeMapTexture : : Coordinate coordinate , GLint l evel) {
( this - > * texture2DImplementation ) ( GLenum ( depthStencilA ttachment) , GLenum ( coordinate ) , texture - > id ( ) , mipL evel) ;
( this - > * texture2DImplementation ) ( a ttachment, GLenum ( coordinate ) , texture - > id ( ) , l evel) ;
}
}
/**
/**
* @ brief Attach cube map texture to given framebuffer color attachment
* @ brief Attach 3 D texture to given buffer
* @ param colorAttachment Color attachment ID ( number between 0 and 15 )
* @ param attachment % Buffer attachment
* @ param texture Cube map texture
* @ param coordinate Cube map coordinate
* @ param mipLevel Mip level
*
* If @ extension { EXT , direct_state_access } is not available and the
* framebufferbuffer is not currently bound , it is bound before the
* operation .
* @ see attachTexture2D ( ) , @ fn_gl { BindFramebuffer } , @ fn_gl { FramebufferTexture }
* or @ fn_gl_extension { NamedFramebufferTexture2D , EXT , direct_state_access }
*/
inline void attachCubeMapTexture ( std : : uint8_t colorAttachment , CubeMapTexture * texture , CubeMapTexture : : Coordinate coordinate , GLint mipLevel ) {
( this - > * texture2DImplementation ) ( GL_COLOR_ATTACHMENT0 + colorAttachment , GLenum ( coordinate ) , texture - > id ( ) , mipLevel ) ;
}
/**
* @ brief Attach 3 D texture to given framebuffer depth / stencil attachment
* @ param depthStencilAttachment Depth / stencil attachment
* @ param texture 3 D texture
* @ param texture 3 D texture
* @ param mipLevel Mip level
* @ param level Mip level
* @ param layer Layer of 2 D image within a 3 D texture
* @ param layer Layer of 2 D image within a 3 D texture
*
*
* If @ extension { EXT , direct_state_access } is not available and the
* If @ extension { EXT , direct_state_access } is not available and the
@ -327,58 +324,39 @@ class MAGNUM_EXPORT Framebuffer: public AbstractFramebuffer {
* @ fn_gl_extension { NamedFramebufferTexture3D , EXT , direct_state_access }
* @ fn_gl_extension { NamedFramebufferTexture3D , EXT , direct_state_access }
* @ requires_es_extension % Extension @ es_extension { OES , texture_3D }
* @ requires_es_extension % Extension @ es_extension { OES , texture_3D }
*/
*/
inline void attachTexture3D ( DepthStencilAttachment depthStencilAttachment , Texture3D * texture , GLint mipLevel , GLint layer ) {
inline void attachTexture3D ( BufferAttachment attachment , Texture3D * texture , GLint level , GLint layer ) {
/** @todo Check for texture target compatibility */
( this - > * texture3DImplementation ) ( GLenum ( depthStencilAttachment ) , texture , mipLevel , layer ) ;
}
/**
* @ brief Attach 3 D texture to given framebuffer color attachment
* @ param colorAttachment Color attachment ID ( number between 0 and 15 )
* @ param texture 3 D texture
* @ param mipLevel Mip level
* @ param layer Layer of 2 D image within a 3 D texture .
*
* If @ extension { EXT , direct_state_access } is not available and the
* framebufferbuffer is not currently bound , it is bound before the
* operation .
* @ see @ fn_gl { BindFramebuffer } , @ fn_gl { FramebufferTexture } or
* @ fn_gl_extension { NamedFramebufferTexture3D , EXT , direct_state_access }
* @ requires_es_extension % Extension @ es_extension { OES , texture_3D }
*/
inline void attachTexture3D ( std : : uint8_t colorAttachment , Texture3D * texture , GLint mipLevel , GLint layer ) {
/** @todo Check for texture target compatibility */
/** @todo Check for texture target compatibility */
( this - > * texture3DImplementation ) ( GL_COLOR_ATTACHMENT0 + colorA ttachment, texture , mipL evel, layer ) ;
( this - > * texture3DImplementation ) ( attachment , texture , level , layer ) ;
}
}
private :
private :
static void MAGNUM_LOCAL initializeContextBasedFunctionality ( Context * context ) ;
static void MAGNUM_LOCAL initializeContextBasedFunctionality ( Context * context ) ;
typedef void ( Framebuffer : : * RenderbufferImplementation ) ( GLenum , Renderbuffer * ) ;
typedef void ( Framebuffer : : * RenderbufferImplementation ) ( BufferAttachment , Renderbuffer * ) ;
void MAGNUM_LOCAL renderbufferImplementationDefault ( GLenum attachment , Renderbuffer * renderbuffer ) ;
void MAGNUM_LOCAL renderbufferImplementationDefault ( BufferAttachment attachment , Renderbuffer * renderbuffer ) ;
# ifndef MAGNUM_TARGET_GLES
# ifndef MAGNUM_TARGET_GLES
void MAGNUM_LOCAL renderbufferImplementationDSA ( GLenum attachment , Renderbuffer * renderbuffer ) ;
void MAGNUM_LOCAL renderbufferImplementationDSA ( BufferAttachment attachment , Renderbuffer * renderbuffer ) ;
# endif
# endif
static RenderbufferImplementation renderbufferImplementation ;
static RenderbufferImplementation renderbufferImplementation ;
# ifndef MAGNUM_TARGET_GLES
# ifndef MAGNUM_TARGET_GLES
typedef void ( Framebuffer : : * Texture1DImplementation ) ( GLenum , Texture1D * , GLint ) ;
typedef void ( Framebuffer : : * Texture1DImplementation ) ( BufferAttachment , Texture1D * , GLint ) ;
void MAGNUM_LOCAL texture1DImplementationDefault ( GLenum attachment , Texture1D * texture , GLint mipL evel) ;
void MAGNUM_LOCAL texture1DImplementationDefault ( BufferAttachment attachment , Texture1D * texture , GLint level ) ;
void MAGNUM_LOCAL texture1DImplementationDSA ( GLenum attachment , Texture1D * texture , GLint mipL evel) ;
void MAGNUM_LOCAL texture1DImplementationDSA ( BufferAttachment attachment , Texture1D * texture , GLint level ) ;
static Texture1DImplementation texture1DImplementation ;
static Texture1DImplementation texture1DImplementation ;
# endif
# endif
typedef void ( Framebuffer : : * Texture2DImplementation ) ( GLenum , GLenum , GLuint , GLint ) ;
typedef void ( Framebuffer : : * Texture2DImplementation ) ( BufferAttachment , GLenum , GLuint , GLint ) ;
void MAGNUM_LOCAL texture2DImplementationDefault ( GLenum attachment , GLenum textureTarget , GLuint textureId , GLint mipL evel) ;
void MAGNUM_LOCAL texture2DImplementationDefault ( BufferAttachment attachment , GLenum textureTarget , GLuint textureId , GLint l evel) ;
# ifndef MAGNUM_TARGET_GLES
# ifndef MAGNUM_TARGET_GLES
void MAGNUM_LOCAL texture2DImplementationDSA ( GLenum attachment , GLenum textureTarget , GLuint textureId , GLint mipL evel) ;
void MAGNUM_LOCAL texture2DImplementationDSA ( BufferAttachment attachment , GLenum textureTarget , GLuint textureId , GLint l evel) ;
# endif
# endif
static MAGNUM_LOCAL Texture2DImplementation texture2DImplementation ;
static MAGNUM_LOCAL Texture2DImplementation texture2DImplementation ;
typedef void ( Framebuffer : : * Texture3DImplementation ) ( GLenum , Texture3D * , GLint , GLint ) ;
typedef void ( Framebuffer : : * Texture3DImplementation ) ( BufferAttachment , Texture3D * , GLint , GLint ) ;
void MAGNUM_LOCAL texture3DImplementationDefault ( GLenum attachment , Texture3D * texture , GLint mipL evel, GLint layer ) ;
void MAGNUM_LOCAL texture3DImplementationDefault ( BufferAttachment attachment , Texture3D * texture , GLint l evel, GLint layer ) ;
# ifndef MAGNUM_TARGET_GLES
# ifndef MAGNUM_TARGET_GLES
void MAGNUM_LOCAL texture3DImplementationDSA ( GLenum attachment , Texture3D * texture , GLint mipL evel, GLint layer ) ;
void MAGNUM_LOCAL texture3DImplementationDSA ( BufferAttachment attachment , Texture3D * texture , GLint l evel, GLint layer ) ;
# endif
# endif
static Texture3DImplementation texture3DImplementation ;
static Texture3DImplementation texture3DImplementation ;
} ;
} ;