| Index: gpu/command_buffer/service/framebuffer_manager.h
|
| diff --git a/gpu/command_buffer/service/framebuffer_manager.h b/gpu/command_buffer/service/framebuffer_manager.h
|
| index 2337843f68ef929b447efbf1cb4c81f7a4658d44..e489536aa438d2a501bf207da6b1f36312b8d190 100644
|
| --- a/gpu/command_buffer/service/framebuffer_manager.h
|
| +++ b/gpu/command_buffer/service/framebuffer_manager.h
|
| @@ -16,6 +16,7 @@
|
| #include "base/memory/ref_counted.h"
|
| #include "gpu/command_buffer/service/context_group.h"
|
| #include "gpu/command_buffer/service/gl_utils.h"
|
| +#include "gpu/command_buffer/service/shader_manager.h"
|
| #include "gpu/gpu_export.h"
|
|
|
| namespace gpu {
|
| @@ -178,11 +179,22 @@ class GPU_EXPORT Framebuffer : public base::RefCounted<Framebuffer> {
|
| // If a color buffer is attached to GL_COLOR_ATTACHMENTi, enable that
|
| // draw buffer for glClear().
|
| // Return true if the DrawBuffers() is actually called.
|
| - bool PrepareDrawBuffersForClear() const;
|
| + bool PrepareDrawBuffersForClearingUninitializedAttachments() const;
|
|
|
| - // Restore draw buffers states that have been changed in
|
| - // PrepareDrawBuffersForClear().
|
| - void RestoreDrawBuffersAfterClear() const;
|
| + // Restore |adjusted_draw_buffers_|.
|
| + void RestoreDrawBuffers() const;
|
| +
|
| + // Checks if a draw buffer's format and its corresponding fragment shader
|
| + // output's type are compatible, i.e., a signed integer typed variable is
|
| + // incompatible with a float or unsigned integer buffer.
|
| + // Return false if incompaticle.
|
| + // Otherwise, filter out the draw buffers that are not written to but are not
|
| + // NONE through DrawBuffers, to be on the safe side. Return true.
|
| + // This is applied before a draw call.
|
| + bool ValidateAndAdjustDrawBuffers(uint32_t fragment_output_type_mask,
|
| + uint32_t fragment_output_written_mask);
|
| +
|
| + bool ContainsActiveIntegerAttachments() const;
|
|
|
| // Return true if any draw buffers has an alpha channel.
|
| bool HasAlphaMRT() const;
|
| @@ -199,6 +211,15 @@ class GPU_EXPORT Framebuffer : public base::RefCounted<Framebuffer> {
|
| return read_buffer_;
|
| }
|
|
|
| + // See member declaration for details.
|
| + // The data are only valid if fbo is complete.
|
| + uint32_t draw_buffer_type_mask() const {
|
| + return draw_buffer_type_mask_;
|
| + }
|
| + uint32_t draw_buffer_bound_mask() const {
|
| + return draw_buffer_bound_mask_;
|
| + }
|
| +
|
| private:
|
| friend class FramebufferManager;
|
| friend class base::RefCounted<Framebuffer>;
|
| @@ -213,6 +234,7 @@ class GPU_EXPORT Framebuffer : public base::RefCounted<Framebuffer> {
|
| bool cleared);
|
|
|
| void MarkAsComplete(unsigned state_id) {
|
| + UpdateDrawBufferMasks();
|
| framebuffer_complete_state_count_id_ = state_id;
|
| }
|
|
|
| @@ -220,6 +242,11 @@ class GPU_EXPORT Framebuffer : public base::RefCounted<Framebuffer> {
|
| return framebuffer_complete_state_count_id_;
|
| }
|
|
|
| + // Cache color attachments' base type mask (FLOAT, INT, UINT) and bound mask.
|
| + // If an attachment point has no image, it's set as UNDEFINED_TYPE.
|
| + // This call is only valid on a complete fbo.
|
| + void UpdateDrawBufferMasks();
|
| +
|
| // The managers that owns this.
|
| FramebufferManager* manager_;
|
|
|
| @@ -238,8 +265,25 @@ class GPU_EXPORT Framebuffer : public base::RefCounted<Framebuffer> {
|
| typedef base::hash_map<GLenum, scoped_refptr<Attachment> > AttachmentMap;
|
| AttachmentMap attachments_;
|
|
|
| + // User's draw buffers setting through DrawBuffers() call.
|
| std::unique_ptr<GLenum[]> draw_buffers_;
|
|
|
| + // If a draw buffer does not have an image, or it has no corresponding
|
| + // fragment shader output variable, it might be filtered out as NONE.
|
| + // Note that the actually draw buffers setting sent to the driver is always
|
| + // consistent with |adjusted_draw_buffers_|, not |draw_buffers_|.
|
| + std::unique_ptr<GLenum[]> adjusted_draw_buffers_;
|
| +
|
| + // Draw buffer base types: FLOAT, INT, or UINT.
|
| + // We have up to 16 draw buffers, each is encoded into 2 bits, total 32 bits:
|
| + // the lowest 2 bits for draw buffer 0, the highest 2 bits for draw buffer 15.
|
| + uint32_t draw_buffer_type_mask_;
|
| + // Same layout as above, 2 bits per draw buffer, 0x03 if a draw buffer has a
|
| + // bound image, 0x00 if not.
|
| + uint32_t draw_buffer_bound_mask_;
|
| + // This is the mask for the actual draw buffers sent to driver.
|
| + uint32_t adjusted_draw_buffer_bound_mask_;
|
| +
|
| GLenum read_buffer_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(Framebuffer);
|
|
|