OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2011 Google Inc. | 3 * Copyright 2011 Google Inc. |
4 * | 4 * |
5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
7 */ | 7 */ |
8 | 8 |
9 | 9 |
10 #include "GrContext.h" | 10 #include "GrContext.h" |
(...skipping 342 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
353 // texels in the resampled image are copies of texels from | 353 // texels in the resampled image are copies of texels from |
354 // the original. | 354 // the original. |
355 GrTextureParams params(SkShader::kClamp_TileMode, needsFiltering); | 355 GrTextureParams params(SkShader::kClamp_TileMode, needsFiltering); |
356 drawState->createTextureEffect(0, clampedTexture, SkMatrix::I(), params)
; | 356 drawState->createTextureEffect(0, clampedTexture, SkMatrix::I(), params)
; |
357 | 357 |
358 // position + texture coordinate | 358 // position + texture coordinate |
359 static const GrVertexAttrib kVertexAttribs[] = { | 359 static const GrVertexAttrib kVertexAttribs[] = { |
360 {kVec2f_GrVertexAttribType, 0}, | 360 {kVec2f_GrVertexAttribType, 0}, |
361 {kVec2f_GrVertexAttribType, sizeof(GrPoint)} | 361 {kVec2f_GrVertexAttribType, sizeof(GrPoint)} |
362 }; | 362 }; |
363 static const GrAttribBindings kAttribBindings = | 363 |
364 GrDrawState::ExplicitTexCoordAttribBindingsBit(0); | 364 static const GrAttribBindings kAttribBindings = GrDrawState::kLocalCoord
s_AttribBindingsBit; |
365 drawState->setAttribBindings(kAttribBindings); | 365 drawState->setAttribBindings(kAttribBindings); |
366 drawState->setVertexAttribs(kVertexAttribs, SK_ARRAY_COUNT(kVertexAttrib
s)); | 366 drawState->setVertexAttribs(kVertexAttribs, SK_ARRAY_COUNT(kVertexAttrib
s)); |
367 drawState->setAttribIndex(GrDrawState::kPosition_AttribIndex, 0); | 367 drawState->setAttribIndex(GrDrawState::kPosition_AttribIndex, 0); |
368 drawState->setAttribIndex(GrDrawState::kTexCoord_AttribIndex, 1); | 368 drawState->setAttribIndex(GrDrawState::kLocalCoords_AttribIndex, 1); |
369 GrDrawTarget::AutoReleaseGeometry arg(fGpu, 4, 0); | 369 GrDrawTarget::AutoReleaseGeometry arg(fGpu, 4, 0); |
370 | 370 |
371 if (arg.succeeded()) { | 371 if (arg.succeeded()) { |
372 GrPoint* verts = (GrPoint*) arg.vertices(); | 372 GrPoint* verts = (GrPoint*) arg.vertices(); |
373 verts[0].setIRectFan(0, 0, texture->width(), texture->height(), 2 *
sizeof(GrPoint)); | 373 verts[0].setIRectFan(0, 0, texture->width(), texture->height(), 2 *
sizeof(GrPoint)); |
374 verts[1].setIRectFan(0, 0, 1, 1, 2 * sizeof(GrPoint)); | 374 verts[1].setIRectFan(0, 0, 1, 1, 2 * sizeof(GrPoint)); |
375 fGpu->drawNonIndexed(kTriangleFan_GrPrimitiveType, 0, 4); | 375 fGpu->drawNonIndexed(kTriangleFan_GrPrimitiveType, 0, 4); |
376 } | 376 } |
377 texture->releaseRenderTarget(); | 377 texture->releaseRenderTarget(); |
378 } else { | 378 } else { |
(...skipping 466 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
845 | 845 |
846 target->drawNonIndexed(kTriangleFan_GrPrimitiveType, 0, 4); | 846 target->drawNonIndexed(kTriangleFan_GrPrimitiveType, 0, 4); |
847 #else | 847 #else |
848 target->drawSimpleRect(rect, matrix); | 848 target->drawSimpleRect(rect, matrix); |
849 #endif | 849 #endif |
850 } | 850 } |
851 } | 851 } |
852 | 852 |
853 void GrContext::drawRectToRect(const GrPaint& paint, | 853 void GrContext::drawRectToRect(const GrPaint& paint, |
854 const GrRect& dstRect, | 854 const GrRect& dstRect, |
855 const GrRect& srcRect, | 855 const GrRect& localRect, |
856 const SkMatrix* dstMatrix, | 856 const SkMatrix* dstMatrix, |
857 const SkMatrix* srcMatrix) { | 857 const SkMatrix* localMatrix) { |
858 SK_TRACE_EVENT0("GrContext::drawRectToRect"); | 858 SK_TRACE_EVENT0("GrContext::drawRectToRect"); |
859 | 859 |
860 // srcRect refers to paint's first color stage | |
861 if (!paint.isColorStageEnabled(0)) { | |
862 drawRect(paint, dstRect, -1, dstMatrix); | |
863 return; | |
864 } | |
865 | |
866 GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW); | 860 GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW); |
| 861 GrDrawState::AutoStageDisable atr(fDrawState); |
867 | 862 |
868 #if GR_STATIC_RECT_VB | 863 #if GR_STATIC_RECT_VB |
869 GrDrawState::AutoStageDisable atr(fDrawState); | |
870 GrDrawState* drawState = target->drawState(); | 864 GrDrawState* drawState = target->drawState(); |
871 | 865 |
872 SkMatrix m; | 866 SkMatrix m; |
873 | 867 |
874 m.setAll(dstRect.width(), 0, dstRect.fLeft, | 868 m.setAll(dstRect.width(), 0, dstRect.fLeft, |
875 0, dstRect.height(), dstRect.fTop, | 869 0, dstRect.height(), dstRect.fTop, |
876 0, 0, SkMatrix::I()[8]); | 870 0, 0, SkMatrix::I()[8]); |
877 if (NULL != dstMatrix) { | 871 if (NULL != dstMatrix) { |
878 m.postConcat(*dstMatrix); | 872 m.postConcat(*dstMatrix); |
879 } | 873 } |
880 | 874 |
881 // The first color stage's coords come from srcRect rather than applying a m
atrix to dstRect. | 875 // This code path plays a little fast and loose with the notion of local coo
rds and coord |
882 // We explicitly compute a matrix for that stage below, no need to adjust he
re. | 876 // change matrices in order to account for localRect and localMatrix. The un
it square VB only |
883 static const uint32_t kExplicitCoordMask = 1 << GrPaint::kFirstColorStage; | 877 // has one set of coords. Rather than using AutoViewMatrixRestore we instead
directly set concat |
884 GrDrawState::AutoViewMatrixRestore avmr(drawState, m, kExplicitCoordMask); | 878 // with m and then call GrDrawState::localCoordChange() with a matrix that a
ccounts for |
| 879 // localRect and localMatrix. This code path is preventing some encapsulatio
n in GrDrawState. |
| 880 SkMatrix savedViewMatrix = drawState->getViewMatrix(); |
| 881 drawState->preConcatViewMatrix(m); |
885 | 882 |
886 m.setAll(srcRect.width(), 0, srcRect.fLeft, | 883 m.setAll(localRect.width(), 0, localRect.fLeft, |
887 0, srcRect.height(), srcRect.fTop, | 884 0, localRect.height(), localRect.fTop, |
888 0, 0, SkMatrix::I()[8]); | 885 0, 0, SkMatrix::I()[8]); |
889 if (NULL != srcMatrix) { | 886 if (NULL != localMatrix) { |
890 m.postConcat(*srcMatrix); | 887 m.postConcat(*localMatrix); |
891 } | 888 } |
892 | 889 drawState->localCoordChange(m); |
893 drawState->preConcatStageMatrices(kExplicitCoordMask, m); | |
894 | 890 |
895 const GrVertexBuffer* sqVB = fGpu->getUnitSquareVertexBuffer(); | 891 const GrVertexBuffer* sqVB = fGpu->getUnitSquareVertexBuffer(); |
896 if (NULL == sqVB) { | 892 if (NULL == sqVB) { |
897 GrPrintf("Failed to create static rect vb.\n"); | 893 GrPrintf("Failed to create static rect vb.\n"); |
898 return; | 894 return; |
899 } | 895 } |
900 drawState->setDefaultVertexAttribs(); | 896 drawState->setDefaultVertexAttribs(); |
901 target->setVertexSourceToBuffer(sqVB); | 897 target->setVertexSourceToBuffer(sqVB); |
902 target->drawNonIndexed(kTriangleFan_GrPrimitiveType, 0, 4); | 898 target->drawNonIndexed(kTriangleFan_GrPrimitiveType, 0, 4); |
| 899 drawState->setViewMatrix(savedViewMatrix); |
903 #else | 900 #else |
904 GrDrawState::AutoStageDisable atr(fDrawState); | 901 target->drawRect(dstRect, dstMatrix, &localRect, localMatrix); |
905 | |
906 target->drawRect(dstRect, dstMatrix, &srcRect, srcMatrix, 0); | |
907 #endif | 902 #endif |
908 } | 903 } |
909 | 904 |
910 void GrContext::drawVertices(const GrPaint& paint, | 905 void GrContext::drawVertices(const GrPaint& paint, |
911 GrPrimitiveType primitiveType, | 906 GrPrimitiveType primitiveType, |
912 int vertexCount, | 907 int vertexCount, |
913 const GrPoint positions[], | 908 const GrPoint positions[], |
914 const GrPoint texCoords[], | 909 const GrPoint texCoords[], |
915 const GrColor colors[], | 910 const GrColor colors[], |
916 const uint16_t indices[], | 911 const uint16_t indices[], |
(...skipping 13 matching lines...) Expand all Loading... |
930 GrAttribBindings bindings = GrDrawState::kDefault_AttribBindings; | 925 GrAttribBindings bindings = GrDrawState::kDefault_AttribBindings; |
931 | 926 |
932 // set position attribute | 927 // set position attribute |
933 drawState->setAttribIndex(GrDrawState::kPosition_AttribIndex, attribs.count(
)); | 928 drawState->setAttribIndex(GrDrawState::kPosition_AttribIndex, attribs.count(
)); |
934 GrVertexAttrib currAttrib = {kVec2f_GrVertexAttribType, currentOffset}; | 929 GrVertexAttrib currAttrib = {kVec2f_GrVertexAttribType, currentOffset}; |
935 attribs.push_back(currAttrib); | 930 attribs.push_back(currAttrib); |
936 currentOffset += sizeof(GrPoint); | 931 currentOffset += sizeof(GrPoint); |
937 | 932 |
938 // set up optional texture coordinate attributes | 933 // set up optional texture coordinate attributes |
939 if (NULL != texCoords) { | 934 if (NULL != texCoords) { |
940 bindings |= GrDrawState::ExplicitTexCoordAttribBindingsBit(0); | 935 bindings |= GrDrawState::kLocalCoords_AttribBindingsBit; |
941 drawState->setAttribIndex(GrDrawState::kTexCoord_AttribIndex, attribs.co
unt()); | 936 drawState->setAttribIndex(GrDrawState::kLocalCoords_AttribIndex, attribs
.count()); |
942 currAttrib.set(kVec2f_GrVertexAttribType, currentOffset); | 937 currAttrib.set(kVec2f_GrVertexAttribType, currentOffset); |
943 attribs.push_back(currAttrib); | 938 attribs.push_back(currAttrib); |
944 texOffset = currentOffset; | 939 texOffset = currentOffset; |
945 currentOffset += sizeof(GrPoint); | 940 currentOffset += sizeof(GrPoint); |
946 } | 941 } |
947 | 942 |
948 // set up optional color attributes | 943 // set up optional color attributes |
949 if (NULL != colors) { | 944 if (NULL != colors) { |
950 bindings |= GrDrawState::kColor_AttribBindingsBit; | 945 bindings |= GrDrawState::kColor_AttribBindingsBit; |
951 drawState->setAttribIndex(GrDrawState::kColor_AttribIndex, attribs.count
()); | 946 drawState->setAttribIndex(GrDrawState::kColor_AttribIndex, attribs.count
()); |
(...skipping 1141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2093 return srcTexture; | 2088 return srcTexture; |
2094 } | 2089 } |
2095 } | 2090 } |
2096 | 2091 |
2097 /////////////////////////////////////////////////////////////////////////////// | 2092 /////////////////////////////////////////////////////////////////////////////// |
2098 #if GR_CACHE_STATS | 2093 #if GR_CACHE_STATS |
2099 void GrContext::printCacheStats() const { | 2094 void GrContext::printCacheStats() const { |
2100 fTextureCache->printStats(); | 2095 fTextureCache->printStats(); |
2101 } | 2096 } |
2102 #endif | 2097 #endif |
OLD | NEW |