Added gpu AA clipping to old shader path

http://codereview.appspot.com/6139065/



git-svn-id: http://skia.googlecode.com/svn/trunk@3812 2bbb7eff-a529-9590-31e7-b0007b416f81
This commit is contained in:
robertphillips@google.com 2012-05-01 17:22:59 +00:00
parent f0a062bc45
commit a72eef322c
5 changed files with 64 additions and 5 deletions

View File

@ -11,6 +11,10 @@
#include "GrRenderTarget.h" #include "GrRenderTarget.h"
#include "GrStencilBuffer.h" #include "GrStencilBuffer.h"
#include "GrPathRenderer.h" #include "GrPathRenderer.h"
#include "GrPaint.h"
//#define GR_AA_CLIP 1
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
void ScissoringSettings::setupScissoring(GrGpu* gpu) { void ScissoringSettings::setupScissoring(GrGpu* gpu) {
@ -22,6 +26,34 @@ void ScissoringSettings::setupScissoring(GrGpu* gpu) {
gpu->enableScissoring(fScissorRect); gpu->enableScissoring(fScissorRect);
} }
namespace {
// set up the draw state to enable the aa clipping mask. Besides setting up the
// sampler matrix this also alters the vertex layout
void setupDrawStateAAClip(GrGpu* gpu, GrTexture* result, const GrRect &bound) {
GrDrawState* drawState = gpu->drawState();
GrAssert(drawState);
static const int maskStage = GrPaint::kTotalStages+1;
GrMatrix mat;
mat.setIDiv(result->width(), result->height());
mat.preTranslate(-bound.fLeft, -bound.fTop);
mat.preConcat(drawState->getViewMatrix());
drawState->sampler(maskStage)->reset(GrSamplerState::kClamp_WrapMode,
GrSamplerState::kNearest_Filter,
mat);
drawState->setTexture(maskStage, result);
// The AA clipping determination happens long after the geometry has
// been set up to draw. Here we directly enable the AA clip mask stage
gpu->addToVertexLayout(
GrDrawTarget::StagePosAsTexCoordVertexLayoutBit(maskStage));
}
}
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// sort out what kind of clip mask needs to be created: alpha, stencil // sort out what kind of clip mask needs to be created: alpha, stencil
// or scissor // or scissor
@ -53,8 +85,12 @@ bool GrClipMaskManager::createClipMask(GrGpu* gpu,
// size for the mask (rather than being bound by the size of the // size for the mask (rather than being bound by the size of the
// render target) we aren't going to use scissoring like the stencil // render target) we aren't going to use scissoring like the stencil
// path does (see scissorSettings below) // path does (see scissorSettings below)
if (this->createAlphaClipMask(gpu, clipIn)) { GrTexture* result = NULL;
GrRect bound;
if (this->createAlphaClipMask(gpu, clipIn, &result, &bound)) {
fClipMaskInAlpha = true; fClipMaskInAlpha = true;
setupDrawStateAAClip(gpu, result, bound);
return true; return true;
} }
@ -319,7 +355,10 @@ void clear(GrGpu* gpu,
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// Create a 8-bit clip mask in alpha // Create a 8-bit clip mask in alpha
bool GrClipMaskManager::createAlphaClipMask(GrGpu* gpu, const GrClip& clipIn) { bool GrClipMaskManager::createAlphaClipMask(GrGpu* gpu,
const GrClip& clipIn,
GrTexture** result,
GrRect *resultBounds) {
GrDrawState* origDrawState = gpu->drawState(); GrDrawState* origDrawState = gpu->drawState();
GrAssert(origDrawState->isClipState()); GrAssert(origDrawState->isClipState());
@ -353,6 +392,8 @@ bool GrClipMaskManager::createAlphaClipMask(GrGpu* gpu, const GrClip& clipIn) {
// path doesn't leave any room for antialiasing (esp. w.r.t. rects) // path doesn't leave any room for antialiasing (esp. w.r.t. rects)
bounds.outset(SkIntToScalar(1), SkIntToScalar(1)); bounds.outset(SkIntToScalar(1), SkIntToScalar(1));
// TODO: make sure we don't outset if bounds are still 0,0 @ min
GrAssert(SkScalarIsInt(bounds.width())); GrAssert(SkScalarIsInt(bounds.width()));
GrAssert(SkScalarIsInt(bounds.height())); GrAssert(SkScalarIsInt(bounds.height()));
@ -464,6 +505,8 @@ bool GrClipMaskManager::createAlphaClipMask(GrGpu* gpu, const GrClip& clipIn) {
} }
} }
*result = accum;
*resultBounds = bounds;
return true; return true;
} }

View File

@ -76,7 +76,10 @@ private:
const GrClip& clip, const GrClip& clip,
const GrRect& bounds, const GrRect& bounds,
ScissoringSettings* scissorSettings); ScissoringSettings* scissorSettings);
bool createAlphaClipMask(GrGpu* gpu, const GrClip& clipIn); bool createAlphaClipMask(GrGpu* gpu,
const GrClip& clipIn,
GrTexture** result,
GrRect *resultBounds);
bool drawPath(GrGpu* gpu, bool drawPath(GrGpu* gpu,
const SkPath& path, const SkPath& path,

View File

@ -331,7 +331,7 @@ public:
//// ////
/** /**
* Sets the matrix applied to veretx positions. * Sets the matrix applied to vertex positions.
* *
* In the post-view-matrix space the rectangle [0,w]x[0,h] * In the post-view-matrix space the rectangle [0,w]x[0,h]
* fully covers the render target. (w and h are the width and height of the * fully covers the render target. (w and h are the width and height of the

View File

@ -20,7 +20,7 @@ namespace {
/** /**
* This function generates some masks that we like to have known at compile * This function generates some masks that we like to have known at compile
* time. When the number of stages or tex coords is bumped or the way bits * time. When the number of stages or tex coords is bumped or the way bits
* are defined in GrDrawTarget.h changes this funcion should be rerun to * are defined in GrDrawTarget.h changes this function should be rerun to
* generate the new masks. (We attempted to force the compiler to generate the * generate the new masks. (We attempted to force the compiler to generate the
* masks using recursive templates but always wound up with static initializers * masks using recursive templates but always wound up with static initializers
* under gcc, even if they were just a series of immediate->memory moves.) * under gcc, even if they were just a series of immediate->memory moves.)

View File

@ -209,6 +209,19 @@ public:
return (1 << (TEX_COORD_BIT_CNT + stage)); return (1 << (TEX_COORD_BIT_CNT + stage));
} }
/**
* Modify the existing vertex layout. Realistically the only thing that
* can be added w/o recomputing the vertex layout is one of the
* StagePosAsTexCoordVertexLayoutBit flags
*/
void addToVertexLayout(int flag) {
GrAssert((1 << TEX_COORD_BIT_CNT) == flag ||
(1 << (TEX_COORD_BIT_CNT + 1)) == flag ||
(1 << (TEX_COORD_BIT_CNT + 2)) == flag ||
(1 << (TEX_COORD_BIT_CNT + 3)) == flag);
fGeoSrcStateStack.back().fVertexLayout |= flag;
}
private: private:
static const int STAGE_BIT_CNT = TEX_COORD_BIT_CNT + static const int STAGE_BIT_CNT = TEX_COORD_BIT_CNT +
GrDrawState::kNumStages; GrDrawState::kNumStages;