Browse Source

Decide between ANGLE/NV implementation for Framebuffer::blit() on ES.

Currently both disabled until extension loader is in place.
pull/68/head
Vladimír Vondruš 12 years ago
parent
commit
24e88afefa
  1. 22
      src/Magnum/AbstractFramebuffer.cpp
  2. 5
      src/Magnum/AbstractFramebuffer.h
  3. 13
      src/Magnum/Implementation/FramebufferState.cpp
  4. 3
      src/Magnum/Implementation/FramebufferState.h

22
src/Magnum/AbstractFramebuffer.cpp

@ -132,19 +132,27 @@ FramebufferTarget AbstractFramebuffer::bindInternal() {
void AbstractFramebuffer::blit(AbstractFramebuffer& source, AbstractFramebuffer& destination, const Range2Di& sourceRectangle, const Range2Di& destinationRectangle, FramebufferBlitMask mask, FramebufferBlitFilter filter) {
source.bindInternal(FramebufferTarget::Read);
destination.bindInternal(FramebufferTarget::Draw);
/** @todo Re-enable when extension loader is available for ES, add also ANGLE version */
#ifndef MAGNUM_TARGET_GLES2
glBlitFramebuffer(sourceRectangle.left(), sourceRectangle.bottom(), sourceRectangle.right(), sourceRectangle.top(), destinationRectangle.left(), destinationRectangle.bottom(), destinationRectangle.right(), destinationRectangle.top(), GLbitfield(mask), GLenum(filter));
#else
static_cast<void>(sourceRectangle);
static_cast<void>(destinationRectangle);
static_cast<void>(mask);
static_cast<void>(filter);
//glBlitFramebufferNV(sourceRectangle.left(), sourceRectangle.bottom(), sourceRectangle.right(), sourceRectangle.top(), destinationRectangle.left(), destinationRectangle.bottom(), destinationRectangle.right(), destinationRectangle.top(), GLbitfield(mask), GLenum(filter));
CORRADE_INTERNAL_ASSERT(false);
Context::current()->state().framebuffer->blitImplementation(sourceRectangle, destinationRectangle, mask, filter);
#endif
}
#ifdef MAGNUM_TARGET_GLES2
void AbstractFramebuffer::blitImplementationANGLE(const Range2Di&, const Range2Di&, FramebufferBlitMask, FramebufferBlitFilter) {
/** @todo Re-enable when extension loader is available for ES */
CORRADE_INTERNAL_ASSERT(false);
//glBlitFramebufferANGLE(sourceRectangle.left(), sourceRectangle.bottom(), sourceRectangle.right(), sourceRectangle.top(), destinationRectangle.left(), destinationRectangle.bottom(), destinationRectangle.right(), destinationRectangle.top(), GLbitfield(mask), GLenum(filter));
}
void AbstractFramebuffer::blitImplementationNV(const Range2Di&, const Range2Di&, FramebufferBlitMask, FramebufferBlitFilter) {
/** @todo Re-enable when extension loader is available for ES */
CORRADE_INTERNAL_ASSERT(false);
//glBlitFramebufferNV(sourceRectangle.left(), sourceRectangle.bottom(), sourceRectangle.right(), sourceRectangle.top(), destinationRectangle.left(), destinationRectangle.bottom(), destinationRectangle.right(), destinationRectangle.top(), GLbitfield(mask), GLenum(filter));
}
#endif
AbstractFramebuffer& AbstractFramebuffer::setViewport(const Range2Di& rectangle) {
_viewport = rectangle;

5
src/Magnum/AbstractFramebuffer.h

@ -337,6 +337,11 @@ class MAGNUM_EXPORT AbstractFramebuffer {
Range2Di _viewport;
private:
#ifdef MAGNUM_TARGET_GLES2
static void MAGNUM_LOCAL blitImplementationANGLE(const Range2Di& sourceRectangle, const Range2Di& destinationRectangle, FramebufferBlitMask mask, FramebufferBlitFilter filter);
static void MAGNUM_LOCAL blitImplementationNV(const Range2Di& sourceRectangle, const Range2Di& destinationRectangle, FramebufferBlitMask mask, FramebufferBlitFilter filter);
#endif
GLenum MAGNUM_LOCAL checkStatusImplementationDefault(FramebufferTarget target);
#ifndef MAGNUM_TARGET_GLES
GLenum MAGNUM_LOCAL checkStatusImplementationDSA(FramebufferTarget target);

13
src/Magnum/Implementation/FramebufferState.cpp

@ -166,6 +166,19 @@ FramebufferState::FramebufferState(Context& context, std::vector<std::string>& e
invalidateImplementation = &AbstractFramebuffer::invalidateImplementationDefault;
invalidateSubImplementation = &AbstractFramebuffer::invalidateImplementationDefault;
#endif
/* Blit implementation on ES2 */
#ifdef MAGNUM_TARGET_GLES2
if(context.isExtensionSupported<Extensions::GL::ANGLE::framebuffer_blit>()) {
extensions.push_back(Extensions::GL::ANGLE::framebuffer_blit::string());
blitImplementation = &AbstractFramebuffer::blitImplementationANGLE;
} else if(context.isExtensionSupported<Extensions::GL::NV::framebuffer_blit>()) {
extensions.push_back(Extensions::GL::NV::framebuffer_blit::string());
blitImplementation = &AbstractFramebuffer::blitImplementationNV;
} else blitImplementation = nullptr;
#endif
}
void FramebufferState::reset() {

3
src/Magnum/Implementation/FramebufferState.h

@ -37,6 +37,9 @@ struct FramebufferState {
void reset();
#ifdef MAGNUM_TARGET_GLES2
void(*blitImplementation)(const Range2Di&, const Range2Di&, FramebufferBlitMask, FramebufferBlitFilter);
#endif
GLenum(AbstractFramebuffer::*checkStatusImplementation)(FramebufferTarget);
void(AbstractFramebuffer::*drawBuffersImplementation)(GLsizei, const GLenum*);
void(AbstractFramebuffer::*drawBufferImplementation)(GLenum);

Loading…
Cancel
Save