214 lines
6.7 KiB
C
214 lines
6.7 KiB
C
|
/*
|
||
|
Copyright 2010 Google Inc.
|
||
|
|
||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
you may not use this file except in compliance with the License.
|
||
|
You may obtain a copy of the License at
|
||
|
|
||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||
|
|
||
|
Unless required by applicable law or agreed to in writing, software
|
||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
See the License for the specific language governing permissions and
|
||
|
limitations under the License.
|
||
|
*/
|
||
|
|
||
|
|
||
|
#ifndef GrTexture_DEFINED
|
||
|
#define GrTexture_DEFINED
|
||
|
|
||
|
#include "GrRefCnt.h"
|
||
|
|
||
|
class GrTexture;
|
||
|
|
||
|
/**
|
||
|
* GrRenderTarget represents a 2D buffer of pixels that can be rendered to.
|
||
|
* A context's render target is set by setRenderTarget(). Render targets are
|
||
|
* created by a createTexture with the kRenderTarget_TextureFlag flag.
|
||
|
* Additionally, the rendering destination set in the underlying 3D API at the
|
||
|
* time of GrContext's creation can be retrieved by calling
|
||
|
* currentRenderTarget() after creation before any calles to setRenderTarget().
|
||
|
*/
|
||
|
class GrRenderTarget : public GrRefCnt {
|
||
|
public:
|
||
|
/**
|
||
|
* @return the width of the rendertarget
|
||
|
*/
|
||
|
virtual uint32_t width() const = 0;
|
||
|
/**
|
||
|
* @return the height of the rendertarget
|
||
|
*/
|
||
|
virtual uint32_t height() const = 0;
|
||
|
|
||
|
/**
|
||
|
* @return the texture associated with the rendertarget, may be NULL.
|
||
|
*/
|
||
|
GrTexture* asTexture() {return fTexture;}
|
||
|
|
||
|
protected:
|
||
|
GrRenderTarget(GrTexture* texture) : fTexture(texture) {}
|
||
|
GrTexture* fTexture;
|
||
|
};
|
||
|
|
||
|
class GrTexture : public GrRefCnt {
|
||
|
public:
|
||
|
enum PixelConfig {
|
||
|
kUnknown_PixelConfig,
|
||
|
kAlpha_8_PixelConfig,
|
||
|
kIndex_8_PixelConfig,
|
||
|
kRGB_565_PixelConfig,
|
||
|
kRGBA_4444_PixelConfig, //!< premultiplied
|
||
|
kRGBA_8888_PixelConfig, //!< premultiplied
|
||
|
kRGBX_8888_PixelConfig, //!< treat the alpha channel as opaque
|
||
|
};
|
||
|
static size_t BytesPerPixel(PixelConfig);
|
||
|
static bool PixelConfigIsOpaque(PixelConfig);
|
||
|
|
||
|
protected:
|
||
|
GrTexture(uint32_t contentWidth,
|
||
|
uint32_t contentHeight,
|
||
|
uint32_t allocWidth,
|
||
|
uint32_t allocHeight,
|
||
|
PixelConfig config) :
|
||
|
fAllocWidth(allocWidth),
|
||
|
fAllocHeight(allocHeight),
|
||
|
fContentWidth(contentWidth),
|
||
|
fContentHeight(contentHeight),
|
||
|
fConfig(config) {
|
||
|
// only make sense if alloc size is pow2
|
||
|
fShiftFixedX = 31 - Gr_clz(allocWidth);
|
||
|
fShiftFixedY = 31 - Gr_clz(allocHeight);
|
||
|
}
|
||
|
public:
|
||
|
virtual ~GrTexture();
|
||
|
|
||
|
/**
|
||
|
* Retrieves the width of the content area of the texture. Reflects the
|
||
|
* width passed to GrGpu::createTexture().
|
||
|
*
|
||
|
* @return the width in texels
|
||
|
*/
|
||
|
uint32_t contentWidth() const { return fContentWidth; }
|
||
|
/**
|
||
|
* Retrieves the height of the content area of the texture. Reflects the
|
||
|
* height passed to GrGpu::createTexture().
|
||
|
*
|
||
|
* @return the height in texels
|
||
|
*/
|
||
|
uint32_t contentHeight() const { return fContentHeight; }
|
||
|
|
||
|
/**
|
||
|
* Retrieves the texture width actually allocated in texels.
|
||
|
*
|
||
|
* @return the width in texels
|
||
|
*/
|
||
|
uint32_t allocWidth() const { return fAllocWidth; }
|
||
|
/**
|
||
|
* Retrieves the texture height actually allocated in texels.
|
||
|
*
|
||
|
* @return the height in texels
|
||
|
*/
|
||
|
uint32_t allocHeight() const { return fAllocHeight; }
|
||
|
|
||
|
/**
|
||
|
* Convert from texels to normalized texture coords for POT textures
|
||
|
* only.
|
||
|
*/
|
||
|
GrFixed normalizeFixedX(GrFixed x) const { GrAssert(GrIsPow2(fAllocWidth));
|
||
|
return x >> fShiftFixedX; }
|
||
|
GrFixed normalizeFixedY(GrFixed y) const { GrAssert(GrIsPow2(fAllocHeight));
|
||
|
return y >> fShiftFixedY; }
|
||
|
|
||
|
/**
|
||
|
* Retrieves the pixel config specified when the texture was created.
|
||
|
*/
|
||
|
PixelConfig config() const { return fConfig; }
|
||
|
|
||
|
/**
|
||
|
* The number of bytes used by the texture
|
||
|
*/
|
||
|
size_t sizeInBytes() const {
|
||
|
return fAllocWidth * fAllocHeight * BytesPerPixel(fConfig);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Updates a subrectangle of texels in the texture.
|
||
|
*
|
||
|
* @param x left edge of rectangle to update
|
||
|
* @param y top edge of rectangle to update
|
||
|
* @param width width of rectangle to update
|
||
|
* @param height height of rectangle to update
|
||
|
* @param srcData width*height texels of data in same format that was used
|
||
|
* at texture creation.
|
||
|
*/
|
||
|
virtual void uploadTextureData(uint32_t x,
|
||
|
uint32_t y,
|
||
|
uint32_t width,
|
||
|
uint32_t height,
|
||
|
const void* srcData) = 0;
|
||
|
/**
|
||
|
* Indicates that GPU context in which this texture was created is destroyed
|
||
|
* and that Ganesh should not attempt to free the texture with the
|
||
|
* underlying API.
|
||
|
*/
|
||
|
virtual void abandon() = 0;
|
||
|
|
||
|
/**
|
||
|
* Queries whether the texture was created as a render target.
|
||
|
*
|
||
|
* Use asRenderTarget() to use the texture as a render target if this
|
||
|
* returns true.
|
||
|
*
|
||
|
* @return true if the texture was created as a render target.
|
||
|
*/
|
||
|
virtual bool isRenderTarget() const = 0;
|
||
|
|
||
|
/**
|
||
|
* Retrieves the render target underlying this texture that can be passed to
|
||
|
* GrGpu::setRenderTarget().
|
||
|
*
|
||
|
* If isRenderTarget() is false then the returned handle is undefined.
|
||
|
*
|
||
|
* @return handle to render target or undefined if the texture is not a
|
||
|
* render target
|
||
|
*/
|
||
|
virtual GrRenderTarget* asRenderTarget() = 0;
|
||
|
|
||
|
/**
|
||
|
* Removes the "rendertargetness" from a texture. This may or may not
|
||
|
* actually do anything with the underlying 3D API.
|
||
|
*/
|
||
|
virtual void removeRenderTarget() = 0;
|
||
|
|
||
|
/**
|
||
|
* Return the native ID or handle to the texture, depending on the
|
||
|
* platform. e.g. on opengl, return the texture ID.
|
||
|
*/
|
||
|
virtual intptr_t getTextureHandle() = 0;
|
||
|
|
||
|
#if GR_DEBUG
|
||
|
void validate() const {
|
||
|
this->INHERITED::validate();
|
||
|
}
|
||
|
#else
|
||
|
void validate() const {}
|
||
|
#endif
|
||
|
|
||
|
private:
|
||
|
uint32_t fAllocWidth;
|
||
|
uint32_t fAllocHeight;
|
||
|
uint32_t fContentWidth;
|
||
|
uint32_t fContentHeight;
|
||
|
// these two shift a fixed-point value into normalized coordinates
|
||
|
// for this texture if the texture is power of two sized.
|
||
|
int fShiftFixedX;
|
||
|
int fShiftFixedY;
|
||
|
PixelConfig fConfig;
|
||
|
|
||
|
typedef GrRefCnt INHERITED;
|
||
|
};
|
||
|
|
||
|
#endif
|
||
|
|