Home | History | Annotate | Download | only in gpu
      1 
      2 /*
      3  * Copyright 2011 Google Inc.
      4  *
      5  * Use of this source code is governed by a BSD-style license that can be
      6  * found in the LICENSE file.
      7  */
      8 
      9 
     10 
     11 #ifndef GrTexture_DEFINED
     12 #define GrTexture_DEFINED
     13 
     14 #include "GrResource.h"
     15 
     16 class GrRenderTarget;
     17 
     18 class GrTexture : public GrResource {
     19 
     20 public:
     21     /**
     22      * Retrieves the width of the texture.
     23      *
     24      * @return the width in texels
     25      */
     26     int width() const { return fWidth; }
     27 
     28     /**
     29      * Retrieves the height of the texture.
     30      *
     31      * @return the height in texels
     32      */
     33     int height() const { return fHeight; }
     34 
     35     /**
     36      * Convert from texels to normalized texture coords for POT textures
     37      * only.
     38      */
     39     GrFixed normalizeFixedX(GrFixed x) const { GrAssert(GrIsPow2(fWidth));
     40                                                return x >> fShiftFixedX; }
     41     GrFixed normalizeFixedY(GrFixed y) const { GrAssert(GrIsPow2(fHeight));
     42                                                return y >> fShiftFixedY; }
     43 
     44     /**
     45      * Retrieves the pixel config specified when the texture was created.
     46      */
     47     GrPixelConfig config() const { return fConfig; }
     48 
     49     /**
     50      *  Approximate number of bytes used by the texture
     51      */
     52     virtual size_t sizeInBytes() const {
     53         return (size_t) fWidth * fHeight * GrBytesPerPixel(fConfig);
     54     }
     55 
     56     /**
     57      * Read a rectangle of pixels from the texture.
     58      * @param left          left edge of the rectangle to read (inclusive)
     59      * @param top           top edge of the rectangle to read (inclusive)
     60      * @param width         width of rectangle to read in pixels.
     61      * @param height        height of rectangle to read in pixels.
     62      * @param config        the pixel config of the destination buffer
     63      * @param buffer        memory to read the rectangle into.
     64      * @param rowBytes      number of bytes bewtween consecutive rows. Zero
     65      *                      means rows are tightly packed.
     66      *
     67      * @return true if the read succeeded, false if not. The read can fail
     68      *              because of a unsupported pixel config.
     69      */
     70     bool readPixels(int left, int top, int width, int height,
     71                     GrPixelConfig config, void* buffer,
     72                     size_t rowBytes);
     73 
     74     /**
     75      * Writes a rectangle of pixels to the texture.
     76      * @param left          left edge of the rectangle to write (inclusive)
     77      * @param top           top edge of the rectangle to write (inclusive)
     78      * @param width         width of rectangle to write in pixels.
     79      * @param height        height of rectangle to write in pixels.
     80      * @param config        the pixel config of the source buffer
     81      * @param buffer        memory to read pixels from
     82      * @param rowBytes      number of bytes bewtween consecutive rows. Zero
     83      *                      means rows are tightly packed.
     84      */
     85     void writePixels(int left, int top, int width, int height,
     86                      GrPixelConfig config, const void* buffer,
     87                      size_t rowBytes);
     88 
     89     /**
     90      * Retrieves the render target underlying this texture that can be passed to
     91      * GrGpu::setRenderTarget().
     92      *
     93      * @return    handle to render target or NULL if the texture is not a
     94      *            render target
     95      */
     96     GrRenderTarget* asRenderTarget() { return fRenderTarget; }
     97 
     98     /**
     99      * Removes the reference on the associated GrRenderTarget held by this
    100      * texture. Afterwards asRenderTarget() will return NULL. The
    101      * GrRenderTarget survives the release if another ref is held on it.
    102      */
    103     void releaseRenderTarget();
    104 
    105     /**
    106      *  Return the native ID or handle to the texture, depending on the
    107      *  platform. e.g. on opengl, return the texture ID.
    108      */
    109     virtual intptr_t getTextureHandle() const = 0;
    110 
    111 #if GR_DEBUG
    112     void validate() const {
    113         this->INHERITED::validate();
    114     }
    115 #else
    116     void validate() const {}
    117 #endif
    118 
    119 protected:
    120     GrRenderTarget* fRenderTarget; // texture refs its rt representation
    121                                    // base class cons sets to NULL
    122                                    // subclass cons can create and set
    123 
    124     GrTexture(GrGpu* gpu,
    125               int width,
    126               int height,
    127               GrPixelConfig config)
    128     : INHERITED(gpu)
    129     , fRenderTarget(NULL)
    130     , fWidth(width)
    131     , fHeight(height)
    132     , fConfig(config) {
    133         // only make sense if alloc size is pow2
    134         fShiftFixedX = 31 - Gr_clz(fWidth);
    135         fShiftFixedY = 31 - Gr_clz(fHeight);
    136     }
    137 
    138     // GrResource overrides
    139     virtual void onRelease() {
    140         this->releaseRenderTarget();
    141     }
    142 
    143     virtual void onAbandon();
    144 
    145 private:
    146     int fWidth;
    147     int fHeight;
    148 
    149     // these two shift a fixed-point value into normalized coordinates
    150     // for this texture if the texture is power of two sized.
    151     int      fShiftFixedX;
    152     int      fShiftFixedY;
    153 
    154     GrPixelConfig fConfig;
    155 
    156     typedef GrResource INHERITED;
    157 };
    158 
    159 #endif
    160 
    161