/* ----------------------------------------------------------------------------- GSFramework Copyright 2001-2013 Emmanuel Julien. All Rights Reserved. ----------------------------------------------------------------------------- */ #ifndef __GPUFBO__ #define __GPUFBO__ #include "ntypes.h" #include "geometry/rect.h" #include "alloc/ialloc.h" namespace GS { namespace Render { struct Texture; } namespace GPU { class Renderer; /*! @short GPU frame buffer object. @author Emmanuel Julien (ejulien@nworks.fr) */ struct FBO { NPLACEMENT_NEW(Renderer) Renderer &renderer; uint color_texture_count; Render::Texture *color_texture[8], *depth_texture; /// Set output color texture. virtual void SetColorTexture(Render::Texture *t) { color_texture[0] = t; color_texture_count = 1; } /// Set output color texture. virtual void SetColorTexture(Render::Texture *t[], uint n) { for (color_texture_count = 0; color_texture_count < n; ++color_texture_count) color_texture[color_texture_count] = t[color_texture_count]; } /// Set output depth texture. virtual void SetDepthTexture(Render::Texture *t) { depth_texture = t; } /// Blit attachment to another FBO attachment. virtual void Blit(FBO *out, const iRect &src, const iRect &dst, bool color = true, bool depth = true) = 0; /// Transfer color pixels into a CPU based buffer, this buffer is expected to be big enough to hold the required region in RGBA format. virtual void ReadColorPixels(char *out, int x, int y, int w, int h) = 0; virtual void ReadDepthPixels(float *out) = 0; /// Create FBO. virtual bool Create() = 0; /// Free FBO. virtual void Free() = 0; FBO(Renderer &r) : renderer(r) { for (uint n = 0; n < 8; ++n) color_texture[n] = 0; color_texture_count = 0; depth_texture = 0; } virtual ~FBO() {} }; } // GPU } // GS #endif // __GPUFBO__