1*8975f5c5SAndroid Build Coastguard Worker // 2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2015 The ANGLE Project Authors. All rights reserved. 3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file. 5*8975f5c5SAndroid Build Coastguard Worker // 6*8975f5c5SAndroid Build Coastguard Worker 7*8975f5c5SAndroid Build Coastguard Worker // FramebufferGL.h: Defines the class interface for FramebufferGL. 8*8975f5c5SAndroid Build Coastguard Worker 9*8975f5c5SAndroid Build Coastguard Worker #ifndef LIBANGLE_RENDERER_GL_FRAMEBUFFERGL_H_ 10*8975f5c5SAndroid Build Coastguard Worker #define LIBANGLE_RENDERER_GL_FRAMEBUFFERGL_H_ 11*8975f5c5SAndroid Build Coastguard Worker 12*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Context.h" 13*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/FramebufferImpl.h" 14*8975f5c5SAndroid Build Coastguard Worker 15*8975f5c5SAndroid Build Coastguard Worker namespace rx 16*8975f5c5SAndroid Build Coastguard Worker { 17*8975f5c5SAndroid Build Coastguard Worker 18*8975f5c5SAndroid Build Coastguard Worker class BlitGL; 19*8975f5c5SAndroid Build Coastguard Worker class ClearMultiviewGL; 20*8975f5c5SAndroid Build Coastguard Worker class FunctionsGL; 21*8975f5c5SAndroid Build Coastguard Worker class StateManagerGL; 22*8975f5c5SAndroid Build Coastguard Worker 23*8975f5c5SAndroid Build Coastguard Worker class FramebufferGL : public FramebufferImpl 24*8975f5c5SAndroid Build Coastguard Worker { 25*8975f5c5SAndroid Build Coastguard Worker public: 26*8975f5c5SAndroid Build Coastguard Worker FramebufferGL(const gl::FramebufferState &data, GLuint id, bool emulatedAlpha); 27*8975f5c5SAndroid Build Coastguard Worker ~FramebufferGL() override; 28*8975f5c5SAndroid Build Coastguard Worker 29*8975f5c5SAndroid Build Coastguard Worker void destroy(const gl::Context *context) override; 30*8975f5c5SAndroid Build Coastguard Worker 31*8975f5c5SAndroid Build Coastguard Worker angle::Result discard(const gl::Context *context, 32*8975f5c5SAndroid Build Coastguard Worker size_t count, 33*8975f5c5SAndroid Build Coastguard Worker const GLenum *attachments) override; 34*8975f5c5SAndroid Build Coastguard Worker angle::Result invalidate(const gl::Context *context, 35*8975f5c5SAndroid Build Coastguard Worker size_t count, 36*8975f5c5SAndroid Build Coastguard Worker const GLenum *attachments) override; 37*8975f5c5SAndroid Build Coastguard Worker angle::Result invalidateSub(const gl::Context *context, 38*8975f5c5SAndroid Build Coastguard Worker size_t count, 39*8975f5c5SAndroid Build Coastguard Worker const GLenum *attachments, 40*8975f5c5SAndroid Build Coastguard Worker const gl::Rectangle &area) override; 41*8975f5c5SAndroid Build Coastguard Worker 42*8975f5c5SAndroid Build Coastguard Worker angle::Result clear(const gl::Context *context, GLbitfield mask) override; 43*8975f5c5SAndroid Build Coastguard Worker angle::Result clearBufferfv(const gl::Context *context, 44*8975f5c5SAndroid Build Coastguard Worker GLenum buffer, 45*8975f5c5SAndroid Build Coastguard Worker GLint drawbuffer, 46*8975f5c5SAndroid Build Coastguard Worker const GLfloat *values) override; 47*8975f5c5SAndroid Build Coastguard Worker angle::Result clearBufferuiv(const gl::Context *context, 48*8975f5c5SAndroid Build Coastguard Worker GLenum buffer, 49*8975f5c5SAndroid Build Coastguard Worker GLint drawbuffer, 50*8975f5c5SAndroid Build Coastguard Worker const GLuint *values) override; 51*8975f5c5SAndroid Build Coastguard Worker angle::Result clearBufferiv(const gl::Context *context, 52*8975f5c5SAndroid Build Coastguard Worker GLenum buffer, 53*8975f5c5SAndroid Build Coastguard Worker GLint drawbuffer, 54*8975f5c5SAndroid Build Coastguard Worker const GLint *values) override; 55*8975f5c5SAndroid Build Coastguard Worker angle::Result clearBufferfi(const gl::Context *context, 56*8975f5c5SAndroid Build Coastguard Worker GLenum buffer, 57*8975f5c5SAndroid Build Coastguard Worker GLint drawbuffer, 58*8975f5c5SAndroid Build Coastguard Worker GLfloat depth, 59*8975f5c5SAndroid Build Coastguard Worker GLint stencil) override; 60*8975f5c5SAndroid Build Coastguard Worker 61*8975f5c5SAndroid Build Coastguard Worker angle::Result readPixels(const gl::Context *context, 62*8975f5c5SAndroid Build Coastguard Worker const gl::Rectangle &area, 63*8975f5c5SAndroid Build Coastguard Worker GLenum format, 64*8975f5c5SAndroid Build Coastguard Worker GLenum type, 65*8975f5c5SAndroid Build Coastguard Worker const gl::PixelPackState &pack, 66*8975f5c5SAndroid Build Coastguard Worker gl::Buffer *packBuffer, 67*8975f5c5SAndroid Build Coastguard Worker void *pixels) override; 68*8975f5c5SAndroid Build Coastguard Worker 69*8975f5c5SAndroid Build Coastguard Worker angle::Result blit(const gl::Context *context, 70*8975f5c5SAndroid Build Coastguard Worker const gl::Rectangle &sourceArea, 71*8975f5c5SAndroid Build Coastguard Worker const gl::Rectangle &destArea, 72*8975f5c5SAndroid Build Coastguard Worker GLbitfield mask, 73*8975f5c5SAndroid Build Coastguard Worker GLenum filter) override; 74*8975f5c5SAndroid Build Coastguard Worker 75*8975f5c5SAndroid Build Coastguard Worker angle::Result getSamplePosition(const gl::Context *context, 76*8975f5c5SAndroid Build Coastguard Worker size_t index, 77*8975f5c5SAndroid Build Coastguard Worker GLfloat *xy) const override; 78*8975f5c5SAndroid Build Coastguard Worker 79*8975f5c5SAndroid Build Coastguard Worker // The GL back-end requires a full sync state before we call checkStatus. 80*8975f5c5SAndroid Build Coastguard Worker bool shouldSyncStateBeforeCheckStatus() const override; 81*8975f5c5SAndroid Build Coastguard Worker 82*8975f5c5SAndroid Build Coastguard Worker gl::FramebufferStatus checkStatus(const gl::Context *context) const override; 83*8975f5c5SAndroid Build Coastguard Worker 84*8975f5c5SAndroid Build Coastguard Worker angle::Result ensureAttachmentsInitialized(const gl::Context *context, 85*8975f5c5SAndroid Build Coastguard Worker const gl::DrawBufferMask &colorAttachments, 86*8975f5c5SAndroid Build Coastguard Worker bool depth, 87*8975f5c5SAndroid Build Coastguard Worker bool stencil) override; 88*8975f5c5SAndroid Build Coastguard Worker 89*8975f5c5SAndroid Build Coastguard Worker angle::Result syncState(const gl::Context *context, 90*8975f5c5SAndroid Build Coastguard Worker GLenum binding, 91*8975f5c5SAndroid Build Coastguard Worker const gl::Framebuffer::DirtyBits &dirtyBits, 92*8975f5c5SAndroid Build Coastguard Worker gl::Command command) override; 93*8975f5c5SAndroid Build Coastguard Worker 94*8975f5c5SAndroid Build Coastguard Worker void updateDefaultFramebufferID(GLuint framebufferID); isDefault()95*8975f5c5SAndroid Build Coastguard Worker bool isDefault() const { return mState.isDefault(); } 96*8975f5c5SAndroid Build Coastguard Worker setHasEmulatedAlphaAttachment(bool hasEmulatedAlphaAttachment)97*8975f5c5SAndroid Build Coastguard Worker void setHasEmulatedAlphaAttachment(bool hasEmulatedAlphaAttachment) 98*8975f5c5SAndroid Build Coastguard Worker { 99*8975f5c5SAndroid Build Coastguard Worker mHasEmulatedAlphaAttachment = hasEmulatedAlphaAttachment; 100*8975f5c5SAndroid Build Coastguard Worker } 101*8975f5c5SAndroid Build Coastguard Worker bool hasEmulatedAlphaChannelTextureAttachment() const; 102*8975f5c5SAndroid Build Coastguard Worker setFramebufferID(GLuint id)103*8975f5c5SAndroid Build Coastguard Worker void setFramebufferID(GLuint id) { mFramebufferID = id; } getFramebufferID()104*8975f5c5SAndroid Build Coastguard Worker GLuint getFramebufferID() const { return mFramebufferID; } 105*8975f5c5SAndroid Build Coastguard Worker 106*8975f5c5SAndroid Build Coastguard Worker private: 107*8975f5c5SAndroid Build Coastguard Worker void syncClearState(const gl::Context *context, GLbitfield mask); 108*8975f5c5SAndroid Build Coastguard Worker void syncClearBufferState(const gl::Context *context, GLenum buffer, GLint drawBuffer); 109*8975f5c5SAndroid Build Coastguard Worker 110*8975f5c5SAndroid Build Coastguard Worker bool modifyInvalidateAttachmentsForEmulatedDefaultFBO( 111*8975f5c5SAndroid Build Coastguard Worker size_t count, 112*8975f5c5SAndroid Build Coastguard Worker const GLenum *attachments, 113*8975f5c5SAndroid Build Coastguard Worker std::vector<GLenum> *modifiedAttachments) const; 114*8975f5c5SAndroid Build Coastguard Worker 115*8975f5c5SAndroid Build Coastguard Worker angle::Result readPixelsRowByRow(const gl::Context *context, 116*8975f5c5SAndroid Build Coastguard Worker const gl::Rectangle &area, 117*8975f5c5SAndroid Build Coastguard Worker GLenum originalReadFormat, 118*8975f5c5SAndroid Build Coastguard Worker GLenum format, 119*8975f5c5SAndroid Build Coastguard Worker GLenum type, 120*8975f5c5SAndroid Build Coastguard Worker const gl::PixelPackState &pack, 121*8975f5c5SAndroid Build Coastguard Worker GLubyte *pixels) const; 122*8975f5c5SAndroid Build Coastguard Worker 123*8975f5c5SAndroid Build Coastguard Worker angle::Result readPixelsAllAtOnce(const gl::Context *context, 124*8975f5c5SAndroid Build Coastguard Worker const gl::Rectangle &area, 125*8975f5c5SAndroid Build Coastguard Worker GLenum originalReadFormat, 126*8975f5c5SAndroid Build Coastguard Worker GLenum format, 127*8975f5c5SAndroid Build Coastguard Worker GLenum type, 128*8975f5c5SAndroid Build Coastguard Worker const gl::PixelPackState &pack, 129*8975f5c5SAndroid Build Coastguard Worker GLubyte *pixels, 130*8975f5c5SAndroid Build Coastguard Worker bool readLastRowSeparately) const; 131*8975f5c5SAndroid Build Coastguard Worker 132*8975f5c5SAndroid Build Coastguard Worker void maskOutInactiveOutputDrawBuffersImpl(const gl::Context *context, 133*8975f5c5SAndroid Build Coastguard Worker gl::DrawBufferMask targetAppliedDrawBuffers); 134*8975f5c5SAndroid Build Coastguard Worker 135*8975f5c5SAndroid Build Coastguard Worker angle::Result adjustSrcDstRegion(const gl::Context *context, 136*8975f5c5SAndroid Build Coastguard Worker const gl::Rectangle &sourceArea, 137*8975f5c5SAndroid Build Coastguard Worker const gl::Rectangle &destArea, 138*8975f5c5SAndroid Build Coastguard Worker gl::Rectangle *newSourceArea, 139*8975f5c5SAndroid Build Coastguard Worker gl::Rectangle *newDestArea); 140*8975f5c5SAndroid Build Coastguard Worker 141*8975f5c5SAndroid Build Coastguard Worker angle::Result clipSrcRegion(const gl::Context *context, 142*8975f5c5SAndroid Build Coastguard Worker const gl::Rectangle &sourceArea, 143*8975f5c5SAndroid Build Coastguard Worker const gl::Rectangle &destArea, 144*8975f5c5SAndroid Build Coastguard Worker gl::Rectangle *newSourceArea, 145*8975f5c5SAndroid Build Coastguard Worker gl::Rectangle *newDestArea); 146*8975f5c5SAndroid Build Coastguard Worker 147*8975f5c5SAndroid Build Coastguard Worker GLuint mFramebufferID; 148*8975f5c5SAndroid Build Coastguard Worker bool mHasEmulatedAlphaAttachment; 149*8975f5c5SAndroid Build Coastguard Worker gl::DrawBufferMask mAppliedEnabledDrawBuffers; 150*8975f5c5SAndroid Build Coastguard Worker }; 151*8975f5c5SAndroid Build Coastguard Worker } // namespace rx 152*8975f5c5SAndroid Build Coastguard Worker 153*8975f5c5SAndroid Build Coastguard Worker #endif // LIBANGLE_RENDERER_GL_FRAMEBUFFERGL_H_ 154