зеркало из https://github.com/mozilla/moz-skia.git
Fixed xoom bug introduced in r5830
https://codereview.appspot.com/6604053/ git-svn-id: http://skia.googlecode.com/svn/trunk@5862 2bbb7eff-a529-9590-31e7-b0007b416f81
This commit is contained in:
Родитель
a1c3d78f22
Коммит
f04c40ef1e
|
@ -92,9 +92,34 @@ void GrInOrderDrawBuffer::drawRect(const GrRect& rect,
|
||||||
bool appendToPreviousDraw = false;
|
bool appendToPreviousDraw = false;
|
||||||
GrVertexLayout layout = GetRectVertexLayout(srcRects);
|
GrVertexLayout layout = GetRectVertexLayout(srcRects);
|
||||||
|
|
||||||
// When we batch rects we store the color at each vertex in order
|
// Batching across colors means we move the draw color into the
|
||||||
// to allow batching when only the draw color is changing (the usual case)
|
// rect's vertex colors to allow greater batching (a lot of rects
|
||||||
|
// in a row differing only in color is a common occurence in tables).
|
||||||
|
bool batchAcrossColors = true;
|
||||||
|
if (!this->getCaps().dualSourceBlendingSupport()) {
|
||||||
|
for (int s = 0; s < GrDrawState::kNumStages; ++s) {
|
||||||
|
if (this->getDrawState().isStageEnabled(s)) {
|
||||||
|
// We disable batching across colors when there is a texture
|
||||||
|
// present because (by pushing the the color to the vertices)
|
||||||
|
// Ganesh loses track of the rect's opacity. This, in turn, can
|
||||||
|
// cause some of the blending optimizations to be disabled. This
|
||||||
|
// becomes a huge problem on some of the smaller devices where
|
||||||
|
// shader derivatives and dual source blending aren't supported.
|
||||||
|
// In those cases paths are often drawn to a texture and then
|
||||||
|
// drawn as a texture (using this method). Because dual source
|
||||||
|
// blending is disabled (and the blend optimizations are short
|
||||||
|
// circuited) some of the more esoteric blend modes can no longer
|
||||||
|
// be supported.
|
||||||
|
// TODO: add tracking of batchAcrossColors's opacity
|
||||||
|
batchAcrossColors = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (batchAcrossColors) {
|
||||||
layout |= kColor_VertexLayoutBit;
|
layout |= kColor_VertexLayoutBit;
|
||||||
|
}
|
||||||
|
|
||||||
AutoReleaseGeometry geo(this, layout, 4, 0);
|
AutoReleaseGeometry geo(this, layout, 4, 0);
|
||||||
if (!geo.succeeded()) {
|
if (!geo.succeeded()) {
|
||||||
|
@ -129,7 +154,9 @@ void GrInOrderDrawBuffer::drawRect(const GrRect& rect,
|
||||||
// Now that the paint's color is stored in the vertices set it to
|
// Now that the paint's color is stored in the vertices set it to
|
||||||
// white so that the following code can batch all the rects regardless
|
// white so that the following code can batch all the rects regardless
|
||||||
// of paint color
|
// of paint color
|
||||||
GrDrawState::AutoColorRestore acr(this->drawState(), SK_ColorWHITE);
|
GrDrawState::AutoColorRestore acr(this->drawState(),
|
||||||
|
batchAcrossColors ? SK_ColorWHITE
|
||||||
|
: this->getDrawState().getColor());
|
||||||
|
|
||||||
// we don't want to miss an opportunity to batch rects together
|
// we don't want to miss an opportunity to batch rects together
|
||||||
// simply because the clip has changed if the clip doesn't affect
|
// simply because the clip has changed if the clip doesn't affect
|
||||||
|
|
Загрузка…
Ссылка в новой задаче