aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--gyp/gpu.gyp2
-rw-r--r--include/gpu/GrRenderTarget.h113
-rw-r--r--include/gpu/GrSurface.h107
-rw-r--r--include/gpu/GrTexture.h96
-rw-r--r--src/gpu/GrSurface.cpp11
-rw-r--r--src/gpu/gl/GrGLRenderTarget.cpp33
6 files changed, 235 insertions, 127 deletions
diff --git a/gyp/gpu.gyp b/gyp/gpu.gyp
index 5acf24422b..b60172182a 100644
--- a/gyp/gpu.gyp
+++ b/gyp/gpu.gyp
@@ -195,6 +195,7 @@
'../include/gpu/GrResource.h',
'../include/gpu/GrSamplerState.h',
'../include/gpu/GrScalar.h',
+ '../include/gpu/GrSurface.h',
'../include/gpu/GrTemplates.h',
'../include/gpu/GrTextContext.h',
'../include/gpu/GrTexture.h',
@@ -271,6 +272,7 @@
'../src/gpu/GrTDArray.h',
'../src/gpu/GrSoftwarePathRenderer.cpp',
'../src/gpu/GrSoftwarePathRenderer.h',
+ '../src/gpu/GrSurface.cpp',
'../src/gpu/GrTextStrike.cpp',
'../src/gpu/GrTextStrike.h',
'../src/gpu/GrTextStrike_impl.h',
diff --git a/include/gpu/GrRenderTarget.h b/include/gpu/GrRenderTarget.h
index c26ca4bb7e..d69e5cada9 100644
--- a/include/gpu/GrRenderTarget.h
+++ b/include/gpu/GrRenderTarget.h
@@ -19,7 +19,7 @@
#define GrRenderTarget_DEFINED
#include "GrRect.h"
-#include "GrResource.h"
+#include "GrSurface.h"
class GrStencilBuffer;
class GrTexture;
@@ -31,31 +31,63 @@ class GrTexture;
* Additionally, GrContext provides methods for creating GrRenderTargets
* that wrap externally created render targets.
*/
-class GrRenderTarget : public GrResource {
+class GrRenderTarget : public GrSurface {
public:
SK_DECLARE_INST_COUNT(GrRenderTarget)
+ // GrResource overrides
+ virtual size_t sizeInBytes() const SK_OVERRIDE;
+
+ // GrSurface overrides
/**
- * @return the width of the rendertarget
+ * @return the texture associated with the rendertarget, may be NULL.
*/
- int width() const { return fDesc.fWidth; }
+ virtual GrTexture* asTexture() SK_OVERRIDE { return fTexture; }
+ virtual const GrTexture* asTexture() const SK_OVERRIDE { return fTexture; }
+
/**
- * @return the height of the rendertarget
+ * @return this render target.
*/
- int height() const { return fDesc.fHeight; }
+ virtual GrRenderTarget* asRenderTarget() SK_OVERRIDE { return this; }
+ virtual const GrRenderTarget* asRenderTarget() const SK_OVERRIDE {
+ return this;
+ }
/**
- * @return the pixel config. Can be kUnknown_GrPixelConfig
- * if client asked us to render to a target that has a pixel
- * config that isn't equivalent with one of our configs.
+ * Reads a rectangle of pixels from the render target.
+ * @param left left edge of the rectangle to read (inclusive)
+ * @param top top edge of the rectangle to read (inclusive)
+ * @param width width of rectangle to read in pixels.
+ * @param height height of rectangle to read in pixels.
+ * @param config the pixel config of the destination buffer
+ * @param buffer memory to read the rectangle into.
+ * @param rowBytes number of bytes bewtween consecutive rows. Zero
+ * means rows are tightly packed.
+ *
+ * @return true if the read succeeded, false if not. The read can fail
+ * because of an unsupported pixel config.
*/
- GrPixelConfig config() const { return fDesc.fConfig; }
+ virtual bool readPixels(int left, int top, int width, int height,
+ GrPixelConfig config, void* buffer,
+ size_t rowBytes) SK_OVERRIDE;
/**
- * @return the texture associated with the rendertarget, may be NULL.
+ * Copy the src pixels [buffer, rowbytes, pixelconfig] into the render
+ * target at the specified rectangle.
+ * @param left left edge of the rectangle to write (inclusive)
+ * @param top top edge of the rectangle to write (inclusive)
+ * @param width width of rectangle to write in pixels.
+ * @param height height of rectangle to write in pixels.
+ * @param config the pixel config of the source buffer
+ * @param buffer memory to read the rectangle from.
+ * @param rowBytes number of bytes bewtween consecutive rows. Zero
+ * means rows are tightly packed.
*/
- GrTexture* asTexture() {return fTexture;}
+ virtual void writePixels(int left, int top, int width, int height,
+ GrPixelConfig config, const void* buffer,
+ size_t rowBytes) SK_OVERRIDE;
+ // GrRenderTarget
/**
* If this RT is multisampled, this is the multisample buffer
* @return the 3D API's handle to this object (e.g. FBO ID in OpenGL)
@@ -71,7 +103,7 @@ public:
virtual intptr_t getRenderTargetResolvedHandle() const = 0;
/**
- * @return true if the render target is multisampled, false otherwise
+ * @return true if the surface is multisampled, false otherwise
*/
bool isMultisampled() const { return 0 != fDesc.fSampleCnt; }
@@ -121,41 +153,6 @@ public:
*/
void resolve();
- // GrResource overrides
- virtual size_t sizeInBytes() const;
-
- /**
- * Reads a rectangle of pixels from the render target.
- * @param left left edge of the rectangle to read (inclusive)
- * @param top top edge of the rectangle to read (inclusive)
- * @param width width of rectangle to read in pixels.
- * @param height height of rectangle to read in pixels.
- * @param config the pixel config of the destination buffer
- * @param buffer memory to read the rectangle into.
- * @param rowBytes number of bytes bewtween consecutive rows. Zero
- * means rows are tightly packed.
- *
- * @return true if the read succeeded, false if not. The read can fail
- * because of an unsupported pixel config.
- */
- bool readPixels(int left, int top, int width, int height,
- GrPixelConfig config, void* buffer, size_t rowBytes);
-
- /**
- * Copy the src pixels [buffer, rowbytes, pixelconfig] into the render
- * target at the specified rectangle.
- * @param left left edge of the rectangle to write (inclusive)
- * @param top top edge of the rectangle to write (inclusive)
- * @param width width of rectangle to write in pixels.
- * @param height height of rectangle to write in pixels.
- * @param config the pixel config of the source buffer
- * @param buffer memory to read the rectangle from.
- * @param rowBytes number of bytes bewtween consecutive rows. Zero
- * means rows are tightly packed.
- */
- void writePixels(int left, int top, int width, int height,
- GrPixelConfig config, const void* buffer, size_t rowBytes);
-
// a MSAA RT may require explicit resolving , it may auto-resolve (e.g. FBO
// 0 in GL), or be unresolvable because the client didn't give us the
// resolve destination.
@@ -175,26 +172,18 @@ public:
protected:
GrRenderTarget(GrGpu* gpu,
GrTexture* texture,
- int width,
- int height,
- GrPixelConfig config,
- int sampleCnt)
- : INHERITED(gpu)
+ const GrTextureDesc& desc)
+ : INHERITED(gpu, desc)
, fStencilBuffer(NULL)
, fTexture(texture) {
fResolveRect.setLargestInverted();
-
- fDesc.fWidth = width;
- fDesc.fHeight = height;
- fDesc.fConfig = config;
- fDesc.fSampleCnt = sampleCnt;
}
friend class GrTexture;
// When a texture unrefs an owned rendertarget this func
- // removes the back pointer. This could be done called from
+ // removes the back pointer. This could be called from
// texture's destructor but would have to be done in derived
- // class. By the time of texture base destructor it has already
+ // classes. By the time of texture base destructor it has already
// lost its pointer to the rt.
void onTextureReleaseRenderTarget() {
GrAssert(NULL != fTexture);
@@ -205,11 +194,9 @@ private:
GrStencilBuffer* fStencilBuffer;
GrTexture* fTexture; // not ref'ed
- GrTextureDesc fDesc;
-
GrIRect fResolveRect;
- typedef GrResource INHERITED;
+ typedef GrSurface INHERITED;
};
#endif
diff --git a/include/gpu/GrSurface.h b/include/gpu/GrSurface.h
new file mode 100644
index 0000000000..2d39b5e10b
--- /dev/null
+++ b/include/gpu/GrSurface.h
@@ -0,0 +1,107 @@
+/*
+ * Copyright 2012 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+
+#ifndef GrSurface_DEFINED
+#define GrSurface_DEFINED
+
+#include "GrTypes.h"
+#include "GrResource.h"
+
+class GrTexture;
+class GrRenderTarget;
+
+class GrSurface : public GrResource {
+public:
+ SK_DECLARE_INST_COUNT(GrSurface);
+
+ /**
+ * Retrieves the width of the surface.
+ *
+ * @return the width in texels
+ */
+ int width() const { return fDesc.fWidth; }
+
+ /**
+ * Retrieves the height of the surface.
+ *
+ * @return the height in texels
+ */
+ int height() const { return fDesc.fHeight; }
+
+ /**
+ * Retrieves the pixel config specified when the surface was created.
+ * For render targets this can be kUnknown_GrPixelConfig
+ * if client asked us to render to a target that has a pixel
+ * config that isn't equivalent with one of our configs.
+ */
+ GrPixelConfig config() const { return fDesc.fConfig; }
+
+ /**
+ * Return the descriptor describing the surface
+ */
+ const GrTextureDesc& desc() const { return fDesc; }
+
+ /**
+ * @return the texture associated with the surface, may be NULL.
+ */
+ virtual GrTexture* asTexture() = 0;
+ virtual const GrTexture* asTexture() const = 0;
+
+ /**
+ * @return the render target underlying this surface, may be NULL.
+ */
+ virtual GrRenderTarget* asRenderTarget() = 0;
+ virtual const GrRenderTarget* asRenderTarget() const = 0;
+
+ /**
+ * Reads a rectangle of pixels from the surface.
+ * @param left left edge of the rectangle to read (inclusive)
+ * @param top top edge of the rectangle to read (inclusive)
+ * @param width width of rectangle to read in pixels.
+ * @param height height of rectangle to read in pixels.
+ * @param config the pixel config of the destination buffer
+ * @param buffer memory to read the rectangle into.
+ * @param rowBytes number of bytes bewtween consecutive rows. Zero
+ * means rows are tightly packed.
+ *
+ * @return true if the read succeeded, false if not. The read can fail
+ * because of an unsupported pixel config.
+ */
+ virtual bool readPixels(int left, int top, int width, int height,
+ GrPixelConfig config, void* buffer,
+ size_t rowBytes) = 0;
+
+ /**
+ * Copy the src pixels [buffer, rowbytes, pixelconfig] into the surface
+ * at the specified rectangle.
+ * @param left left edge of the rectangle to write (inclusive)
+ * @param top top edge of the rectangle to write (inclusive)
+ * @param width width of rectangle to write in pixels.
+ * @param height height of rectangle to write in pixels.
+ * @param config the pixel config of the source buffer
+ * @param buffer memory to read the rectangle from.
+ * @param rowBytes number of bytes bewtween consecutive rows. Zero
+ * means rows are tightly packed.
+ */
+ virtual void writePixels(int left, int top, int width, int height,
+ GrPixelConfig config, const void* buffer,
+ size_t rowBytes) = 0;
+
+protected:
+ GrTextureDesc fDesc;
+
+ GrSurface(GrGpu* gpu, const GrTextureDesc& desc)
+ : INHERITED(gpu)
+ , fDesc(desc) {
+ }
+
+private:
+ typedef GrResource INHERITED;
+};
+
+#endif // GrSurface_DEFINED
diff --git a/include/gpu/GrTexture.h b/include/gpu/GrTexture.h
index 704bb28f0b..79b39ec9f8 100644
--- a/include/gpu/GrTexture.h
+++ b/include/gpu/GrTexture.h
@@ -6,12 +6,10 @@
* found in the LICENSE file.
*/
-
-
#ifndef GrTexture_DEFINED
#define GrTexture_DEFINED
-#include "GrResource.h"
+#include "GrSurface.h"
class GrRenderTarget;
class GrResourceKey;
@@ -28,57 +26,22 @@ static const uint64_t kUncached_CacheID = 0xAAAAAAAA;
static const uint64_t kScratch_CacheID = 0xBBBBBBBB;
-class GrTexture : public GrResource {
+class GrTexture : public GrSurface {
public:
SK_DECLARE_INST_COUNT(GrTexture)
- /**
- * Retrieves the width of the texture.
- *
- * @return the width in texels
- */
- int width() const { return fDesc.fWidth; }
-
- /**
- * Retrieves the height of the texture.
- *
- * @return the height in texels
- */
- int height() const { return fDesc.fHeight; }
-
- /**
- * Convert from texels to normalized texture coords for POT textures
- * only.
- */
- GrFixed normalizeFixedX(GrFixed x) const {
- GrAssert(GrIsPow2(fDesc.fWidth));
- return x >> fShiftFixedX;
- }
- GrFixed normalizeFixedY(GrFixed y) const {
- GrAssert(GrIsPow2(fDesc.fHeight));
- return y >> fShiftFixedY;
- }
-
- /**
- * Retrieves the pixel config specified when the texture was created.
- */
- GrPixelConfig config() const { return fDesc.fConfig; }
-
- /**
- * Return the descriptor describing the texture
- */
- const GrTextureDesc& desc() const { return fDesc; }
-
+ // from GrResource
/**
* Approximate number of bytes used by the texture
*/
- virtual size_t sizeInBytes() const {
+ virtual size_t sizeInBytes() const SK_OVERRIDE {
return (size_t) fDesc.fWidth *
fDesc.fHeight *
GrBytesPerPixel(fDesc.fConfig);
}
+ // from GrSurface
/**
* Read a rectangle of pixels from the texture.
* @param left left edge of the rectangle to read (inclusive)
@@ -93,9 +56,9 @@ public:
* @return true if the read succeeded, false if not. The read can fail
* because of a unsupported pixel config.
*/
- bool readPixels(int left, int top, int width, int height,
- GrPixelConfig config, void* buffer,
- size_t rowBytes);
+ virtual bool readPixels(int left, int top, int width, int height,
+ GrPixelConfig config, void* buffer,
+ size_t rowBytes) SK_OVERRIDE;
/**
* Writes a rectangle of pixels to the texture.
@@ -108,9 +71,15 @@ public:
* @param rowBytes number of bytes between consecutive rows. Zero
* means rows are tightly packed.
*/
- void writePixels(int left, int top, int width, int height,
- GrPixelConfig config, const void* buffer,
- size_t rowBytes);
+ virtual void writePixels(int left, int top, int width, int height,
+ GrPixelConfig config, const void* buffer,
+ size_t rowBytes) SK_OVERRIDE;
+
+ /**
+ * @return this texture
+ */
+ virtual GrTexture* asTexture() SK_OVERRIDE { return this; }
+ virtual const GrTexture* asTexture() const SK_OVERRIDE { return this; }
/**
* Retrieves the render target underlying this texture that can be passed to
@@ -119,8 +88,26 @@ public:
* @return handle to render target or NULL if the texture is not a
* render target
*/
- GrRenderTarget* asRenderTarget() { return fRenderTarget; }
- const GrRenderTarget* asRenderTarget() const { return fRenderTarget; }
+ virtual GrRenderTarget* asRenderTarget() SK_OVERRIDE {
+ return fRenderTarget;
+ }
+ virtual const GrRenderTarget* asRenderTarget() const SK_OVERRIDE {
+ return fRenderTarget;
+ }
+
+ // GrTexture
+ /**
+ * Convert from texels to normalized texture coords for POT textures
+ * only.
+ */
+ GrFixed normalizeFixedX(GrFixed x) const {
+ GrAssert(GrIsPow2(fDesc.fWidth));
+ return x >> fShiftFixedX;
+ }
+ GrFixed normalizeFixedY(GrFixed y) const {
+ GrAssert(GrIsPow2(fDesc.fHeight));
+ return y >> fShiftFixedY;
+ }
/**
* Removes the reference on the associated GrRenderTarget held by this
@@ -166,9 +153,8 @@ protected:
// subclass cons can create and set
GrTexture(GrGpu* gpu, const GrTextureDesc& desc)
- : INHERITED(gpu)
- , fRenderTarget(NULL)
- , fDesc(desc) {
+ : INHERITED(gpu, desc)
+ , fRenderTarget(NULL) {
// only make sense if alloc size is pow2
fShiftFixedX = 31 - Gr_clz(fDesc.fWidth);
@@ -185,14 +171,12 @@ protected:
void validateDesc() const;
private:
- GrTextureDesc fDesc;
-
// 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;
- typedef GrResource INHERITED;
+ typedef GrSurface INHERITED;
};
#endif
diff --git a/src/gpu/GrSurface.cpp b/src/gpu/GrSurface.cpp
new file mode 100644
index 0000000000..3fd90d912c
--- /dev/null
+++ b/src/gpu/GrSurface.cpp
@@ -0,0 +1,11 @@
+/*
+ * Copyright 2012 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "GrSurface.h"
+
+SK_DEFINE_INST_COUNT(GrSurface)
+
diff --git a/src/gpu/gl/GrGLRenderTarget.cpp b/src/gpu/gl/GrGLRenderTarget.cpp
index cce3def89a..4193519357 100644
--- a/src/gpu/gl/GrGLRenderTarget.cpp
+++ b/src/gpu/gl/GrGLRenderTarget.cpp
@@ -25,6 +25,23 @@ void GrGLRenderTarget::init(const Desc& desc,
GrSafeRef(fTexIDObj);
}
+namespace {
+GrTextureDesc MakeDesc(GrTextureFlags flags,
+ int width, int height,
+ GrPixelConfig config, int sampleCnt,
+ uint64_t clientCacheID) {
+ GrTextureDesc temp;
+ temp.fFlags = flags;
+ temp.fWidth = width;
+ temp.fHeight = height;
+ temp.fConfig = config;
+ temp.fSampleCnt = sampleCnt;
+ temp.fClientCacheID = clientCacheID;
+ return temp;
+}
+
+};
+
GrGLRenderTarget::GrGLRenderTarget(GrGpuGL* gpu,
const Desc& desc,
const GrGLIRect& viewport,
@@ -32,10 +49,10 @@ GrGLRenderTarget::GrGLRenderTarget(GrGpuGL* gpu,
GrGLTexture* texture)
: INHERITED(gpu,
texture,
- viewport.fWidth,
- viewport.fHeight,
- desc.fConfig,
- desc.fSampleCnt) {
+ MakeDesc(kNone_GrTextureFlags,
+ viewport.fWidth, viewport.fHeight,
+ desc.fConfig, desc.fSampleCnt,
+ kDefault_CacheID)) {
GrAssert(NULL != texID);
GrAssert(NULL != texture);
// FBO 0 can't also be a texture, right?
@@ -54,10 +71,10 @@ GrGLRenderTarget::GrGLRenderTarget(GrGpuGL* gpu,
const GrGLIRect& viewport)
: INHERITED(gpu,
NULL,
- viewport.fWidth,
- viewport.fHeight,
- desc.fConfig,
- desc.fSampleCnt) {
+ MakeDesc(kNone_GrTextureFlags,
+ viewport.fWidth, viewport.fHeight,
+ desc.fConfig, desc.fSampleCnt,
+ kDefault_CacheID)) {
this->init(desc, viewport, NULL);
}