Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(223)

Side by Side Diff: src/gpu/GrContext.cpp

Issue 216503004: SK_SUPPORT_LEGACY_GRTYPES to hide duplicate types from SkTypes.h (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 252 matching lines...) Expand 10 before | Expand all | Expand 10 after
263 return static_cast<GrStencilBuffer*>(resource); 263 return static_cast<GrStencilBuffer*>(resource);
264 } 264 }
265 265
266 static void stretchImage(void* dst, 266 static void stretchImage(void* dst,
267 int dstW, 267 int dstW,
268 int dstH, 268 int dstH,
269 void* src, 269 void* src,
270 int srcW, 270 int srcW,
271 int srcH, 271 int srcH,
272 size_t bpp) { 272 size_t bpp) {
273 GrFixed dx = (srcW << 16) / dstW; 273 SkFixed dx = (srcW << 16) / dstW;
274 GrFixed dy = (srcH << 16) / dstH; 274 SkFixed dy = (srcH << 16) / dstH;
275 275
276 GrFixed y = dy >> 1; 276 SkFixed y = dy >> 1;
277 277
278 size_t dstXLimit = dstW*bpp; 278 size_t dstXLimit = dstW*bpp;
279 for (int j = 0; j < dstH; ++j) { 279 for (int j = 0; j < dstH; ++j) {
280 GrFixed x = dx >> 1; 280 SkFixed x = dx >> 1;
281 void* srcRow = (uint8_t*)src + (y>>16)*srcW*bpp; 281 void* srcRow = (uint8_t*)src + (y>>16)*srcW*bpp;
282 void* dstRow = (uint8_t*)dst + j*dstW*bpp; 282 void* dstRow = (uint8_t*)dst + j*dstW*bpp;
283 for (size_t i = 0; i < dstXLimit; i += bpp) { 283 for (size_t i = 0; i < dstXLimit; i += bpp) {
284 memcpy((uint8_t*) dstRow + i, 284 memcpy((uint8_t*) dstRow + i,
285 (uint8_t*) srcRow + (x>>16)*bpp, 285 (uint8_t*) srcRow + (x>>16)*bpp,
286 bpp); 286 bpp);
287 x += dx; 287 x += dx;
288 } 288 }
289 y += dy; 289 y += dy;
290 } 290 }
291 } 291 }
292 292
293 namespace { 293 namespace {
294 294
295 // position + local coordinate 295 // position + local coordinate
296 extern const GrVertexAttrib gVertexAttribs[] = { 296 extern const GrVertexAttrib gVertexAttribs[] = {
297 {kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBinding }, 297 {kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBinding },
298 {kVec2f_GrVertexAttribType, sizeof(GrPoint), kLocalCoord_GrVertexAttribBindi ng} 298 {kVec2f_GrVertexAttribType, sizeof(SkPoint), kLocalCoord_GrVertexAttribBindi ng}
299 }; 299 };
300 300
301 }; 301 };
302 302
303 // The desired texture is NPOT and tiled but that isn't supported by 303 // The desired texture is NPOT and tiled but that isn't supported by
304 // the current hardware. Resize the texture to be a POT 304 // the current hardware. Resize the texture to be a POT
305 GrTexture* GrContext::createResizedTexture(const GrTextureDesc& desc, 305 GrTexture* GrContext::createResizedTexture(const GrTextureDesc& desc,
306 const GrCacheID& cacheID, 306 const GrCacheID& cacheID,
307 void* srcData, 307 void* srcData,
308 size_t rowBytes, 308 size_t rowBytes,
(...skipping 26 matching lines...) Expand all
335 // the original. 335 // the original.
336 GrTextureParams params(SkShader::kClamp_TileMode, filter ? GrTexturePara ms::kBilerp_FilterMode : 336 GrTextureParams params(SkShader::kClamp_TileMode, filter ? GrTexturePara ms::kBilerp_FilterMode :
337 GrTexturePara ms::kNone_FilterMode); 337 GrTexturePara ms::kNone_FilterMode);
338 drawState->addColorTextureEffect(clampedTexture, SkMatrix::I(), params); 338 drawState->addColorTextureEffect(clampedTexture, SkMatrix::I(), params);
339 339
340 drawState->setVertexAttribs<gVertexAttribs>(SK_ARRAY_COUNT(gVertexAttrib s)); 340 drawState->setVertexAttribs<gVertexAttribs>(SK_ARRAY_COUNT(gVertexAttrib s));
341 341
342 GrDrawTarget::AutoReleaseGeometry arg(fGpu, 4, 0); 342 GrDrawTarget::AutoReleaseGeometry arg(fGpu, 4, 0);
343 343
344 if (arg.succeeded()) { 344 if (arg.succeeded()) {
345 GrPoint* verts = (GrPoint*) arg.vertices(); 345 SkPoint* verts = (SkPoint*) arg.vertices();
346 verts[0].setIRectFan(0, 0, texture->width(), texture->height(), 2 * sizeof(GrPoint)); 346 verts[0].setIRectFan(0, 0, texture->width(), texture->height(), 2 * sizeof(SkPoint));
347 verts[1].setIRectFan(0, 0, 1, 1, 2 * sizeof(GrPoint)); 347 verts[1].setIRectFan(0, 0, 1, 1, 2 * sizeof(SkPoint));
348 fGpu->drawNonIndexed(kTriangleFan_GrPrimitiveType, 0, 4); 348 fGpu->drawNonIndexed(kTriangleFan_GrPrimitiveType, 0, 4);
349 } 349 }
350 } else { 350 } else {
351 // TODO: Our CPU stretch doesn't filter. But we create separate 351 // TODO: Our CPU stretch doesn't filter. But we create separate
352 // stretched textures when the texture params is either filtered or 352 // stretched textures when the texture params is either filtered or
353 // not. Either implement filtered stretch blit on CPU or just create 353 // not. Either implement filtered stretch blit on CPU or just create
354 // one when FBO case fails. 354 // one when FBO case fails.
355 355
356 rtDesc.fFlags = kNone_GrTextureFlags; 356 rtDesc.fFlags = kNone_GrTextureFlags;
357 // no longer need to clamp at min RT size. 357 // no longer need to clamp at min RT size.
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
432 !(inDesc.fFlags & kRenderTarget_GrTextureFlagBit)) { 432 !(inDesc.fFlags & kRenderTarget_GrTextureFlagBit)) {
433 // If we're never recycling this texture we can always make it the right size 433 // If we're never recycling this texture we can always make it the right size
434 return create_scratch_texture(fGpu, fTextureCache, inDesc); 434 return create_scratch_texture(fGpu, fTextureCache, inDesc);
435 } 435 }
436 436
437 GrTextureDesc desc = inDesc; 437 GrTextureDesc desc = inDesc;
438 438
439 if (kApprox_ScratchTexMatch == match) { 439 if (kApprox_ScratchTexMatch == match) {
440 // bin by pow2 with a reasonable min 440 // bin by pow2 with a reasonable min
441 static const int MIN_SIZE = 16; 441 static const int MIN_SIZE = 16;
442 desc.fWidth = GrMax(MIN_SIZE, GrNextPow2(desc.fWidth)); 442 desc.fWidth = SkTMax(MIN_SIZE, GrNextPow2(desc.fWidth));
443 desc.fHeight = GrMax(MIN_SIZE, GrNextPow2(desc.fHeight)); 443 desc.fHeight = SkTMax(MIN_SIZE, GrNextPow2(desc.fHeight));
444 } 444 }
445 445
446 GrResource* resource = NULL; 446 GrResource* resource = NULL;
447 int origWidth = desc.fWidth; 447 int origWidth = desc.fWidth;
448 int origHeight = desc.fHeight; 448 int origHeight = desc.fHeight;
449 449
450 do { 450 do {
451 GrResourceKey key = GrTexture::ComputeScratchKey(desc); 451 GrResourceKey key = GrTexture::ComputeScratchKey(desc);
452 // Ensure we have exclusive access to the texture so future 'find' calls don't return it 452 // Ensure we have exclusive access to the texture so future 'find' calls don't return it
453 resource = fTextureCache->find(key, GrResourceCache::kHide_OwnershipFlag ); 453 resource = fTextureCache->find(key, GrResourceCache::kHide_OwnershipFlag );
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
573 void GrContext::getTextureCacheLimits(int* maxTextures, 573 void GrContext::getTextureCacheLimits(int* maxTextures,
574 size_t* maxTextureBytes) const { 574 size_t* maxTextureBytes) const {
575 fTextureCache->getLimits(maxTextures, maxTextureBytes); 575 fTextureCache->getLimits(maxTextures, maxTextureBytes);
576 } 576 }
577 577
578 void GrContext::setTextureCacheLimits(int maxTextures, size_t maxTextureBytes) { 578 void GrContext::setTextureCacheLimits(int maxTextures, size_t maxTextureBytes) {
579 fTextureCache->setLimits(maxTextures, maxTextureBytes); 579 fTextureCache->setLimits(maxTextures, maxTextureBytes);
580 } 580 }
581 581
582 int GrContext::getMaxTextureSize() const { 582 int GrContext::getMaxTextureSize() const {
583 return GrMin(fGpu->caps()->maxTextureSize(), fMaxTextureSizeOverride); 583 return SkTMin(fGpu->caps()->maxTextureSize(), fMaxTextureSizeOverride);
584 } 584 }
585 585
586 int GrContext::getMaxRenderTargetSize() const { 586 int GrContext::getMaxRenderTargetSize() const {
587 return fGpu->caps()->maxRenderTargetSize(); 587 return fGpu->caps()->maxRenderTargetSize();
588 } 588 }
589 589
590 int GrContext::getMaxSampleCount() const { 590 int GrContext::getMaxSampleCount() const {
591 return fGpu->caps()->maxSampleCount(); 591 return fGpu->caps()->maxSampleCount();
592 } 592 }
593 593
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
673 } 673 }
674 #endif 674 #endif
675 675
676 //////////////////////////////////////////////////////////////////////////////// 676 ////////////////////////////////////////////////////////////////////////////////
677 677
678 /* create a triangle strip that strokes the specified triangle. There are 8 678 /* create a triangle strip that strokes the specified triangle. There are 8
679 unique vertices, but we repreat the last 2 to close up. Alternatively we 679 unique vertices, but we repreat the last 2 to close up. Alternatively we
680 could use an indices array, and then only send 8 verts, but not sure that 680 could use an indices array, and then only send 8 verts, but not sure that
681 would be faster. 681 would be faster.
682 */ 682 */
683 static void setStrokeRectStrip(GrPoint verts[10], SkRect rect, 683 static void setStrokeRectStrip(SkPoint verts[10], SkRect rect,
684 SkScalar width) { 684 SkScalar width) {
685 const SkScalar rad = SkScalarHalf(width); 685 const SkScalar rad = SkScalarHalf(width);
686 rect.sort(); 686 rect.sort();
687 687
688 verts[0].set(rect.fLeft + rad, rect.fTop + rad); 688 verts[0].set(rect.fLeft + rad, rect.fTop + rad);
689 verts[1].set(rect.fLeft - rad, rect.fTop - rad); 689 verts[1].set(rect.fLeft - rad, rect.fTop - rad);
690 verts[2].set(rect.fRight - rad, rect.fTop + rad); 690 verts[2].set(rect.fRight - rad, rect.fTop + rad);
691 verts[3].set(rect.fRight + rad, rect.fTop - rad); 691 verts[3].set(rect.fRight + rad, rect.fTop - rad);
692 verts[4].set(rect.fRight - rad, rect.fBottom - rad); 692 verts[4].set(rect.fRight - rad, rect.fBottom - rad);
693 verts[5].set(rect.fRight + rad, rect.fBottom + rad); 693 verts[5].set(rect.fRight + rad, rect.fBottom + rad);
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after
849 target->drawState()->setDefaultVertexAttribs(); 849 target->drawState()->setDefaultVertexAttribs();
850 GrDrawTarget::AutoReleaseGeometry geo(target, worstCaseVertCount, 0); 850 GrDrawTarget::AutoReleaseGeometry geo(target, worstCaseVertCount, 0);
851 851
852 if (!geo.succeeded()) { 852 if (!geo.succeeded()) {
853 GrPrintf("Failed to get space for vertices!\n"); 853 GrPrintf("Failed to get space for vertices!\n");
854 return; 854 return;
855 } 855 }
856 856
857 GrPrimitiveType primType; 857 GrPrimitiveType primType;
858 int vertCount; 858 int vertCount;
859 GrPoint* vertex = geo.positions(); 859 SkPoint* vertex = geo.positions();
860 860
861 if (width > 0) { 861 if (width > 0) {
862 vertCount = 10; 862 vertCount = 10;
863 primType = kTriangleStrip_GrPrimitiveType; 863 primType = kTriangleStrip_GrPrimitiveType;
864 setStrokeRectStrip(vertex, rect, width); 864 setStrokeRectStrip(vertex, rect, width);
865 } else { 865 } else {
866 // hairline 866 // hairline
867 vertCount = 5; 867 vertCount = 5;
868 primType = kLineStrip_GrPrimitiveType; 868 primType = kLineStrip_GrPrimitiveType;
869 vertex[0].set(rect.fLeft, rect.fTop); 869 vertex[0].set(rect.fLeft, rect.fTop);
(...skipping 27 matching lines...) Expand all
897 897
898 GR_CREATE_TRACE_MARKER("GrContext::drawRectToRect", target); 898 GR_CREATE_TRACE_MARKER("GrContext::drawRectToRect", target);
899 899
900 target->drawRect(dstRect, dstMatrix, &localRect, localMatrix); 900 target->drawRect(dstRect, dstMatrix, &localRect, localMatrix);
901 } 901 }
902 902
903 namespace { 903 namespace {
904 904
905 extern const GrVertexAttrib gPosUVColorAttribs[] = { 905 extern const GrVertexAttrib gPosUVColorAttribs[] = {
906 {kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBinding }, 906 {kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBinding },
907 {kVec2f_GrVertexAttribType, sizeof(GrPoint), kLocalCoord_GrVertexAttribBind ing }, 907 {kVec2f_GrVertexAttribType, sizeof(SkPoint), kLocalCoord_GrVertexAttribBind ing },
908 {kVec4ub_GrVertexAttribType, 2*sizeof(GrPoint), kColor_GrVertexAttribBinding } 908 {kVec4ub_GrVertexAttribType, 2*sizeof(SkPoint), kColor_GrVertexAttribBinding }
909 }; 909 };
910 910
911 extern const GrVertexAttrib gPosColorAttribs[] = { 911 extern const GrVertexAttrib gPosColorAttribs[] = {
912 {kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBinding}, 912 {kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBinding},
913 {kVec4ub_GrVertexAttribType, sizeof(GrPoint), kColor_GrVertexAttribBinding}, 913 {kVec4ub_GrVertexAttribType, sizeof(SkPoint), kColor_GrVertexAttribBinding},
914 }; 914 };
915 915
916 static void set_vertex_attributes(GrDrawState* drawState, 916 static void set_vertex_attributes(GrDrawState* drawState,
917 const GrPoint* texCoords, 917 const SkPoint* texCoords,
918 const GrColor* colors, 918 const GrColor* colors,
919 int* colorOffset, 919 int* colorOffset,
920 int* texOffset) { 920 int* texOffset) {
921 *texOffset = -1; 921 *texOffset = -1;
922 *colorOffset = -1; 922 *colorOffset = -1;
923 923
924 if (NULL != texCoords && NULL != colors) { 924 if (NULL != texCoords && NULL != colors) {
925 *texOffset = sizeof(GrPoint); 925 *texOffset = sizeof(SkPoint);
926 *colorOffset = 2*sizeof(GrPoint); 926 *colorOffset = 2*sizeof(SkPoint);
927 drawState->setVertexAttribs<gPosUVColorAttribs>(3); 927 drawState->setVertexAttribs<gPosUVColorAttribs>(3);
928 } else if (NULL != texCoords) { 928 } else if (NULL != texCoords) {
929 *texOffset = sizeof(GrPoint); 929 *texOffset = sizeof(SkPoint);
930 drawState->setVertexAttribs<gPosUVColorAttribs>(2); 930 drawState->setVertexAttribs<gPosUVColorAttribs>(2);
931 } else if (NULL != colors) { 931 } else if (NULL != colors) {
932 *colorOffset = sizeof(GrPoint); 932 *colorOffset = sizeof(SkPoint);
933 drawState->setVertexAttribs<gPosColorAttribs>(2); 933 drawState->setVertexAttribs<gPosColorAttribs>(2);
934 } else { 934 } else {
935 drawState->setVertexAttribs<gPosColorAttribs>(1); 935 drawState->setVertexAttribs<gPosColorAttribs>(1);
936 } 936 }
937 } 937 }
938 938
939 }; 939 };
940 940
941 void GrContext::drawVertices(const GrPaint& paint, 941 void GrContext::drawVertices(const GrPaint& paint,
942 GrPrimitiveType primitiveType, 942 GrPrimitiveType primitiveType,
943 int vertexCount, 943 int vertexCount,
944 const GrPoint positions[], 944 const SkPoint positions[],
945 const GrPoint texCoords[], 945 const SkPoint texCoords[],
946 const GrColor colors[], 946 const GrColor colors[],
947 const uint16_t indices[], 947 const uint16_t indices[],
948 int indexCount) { 948 int indexCount) {
949 AutoRestoreEffects are; 949 AutoRestoreEffects are;
950 AutoCheckFlush acf(this); 950 AutoCheckFlush acf(this);
951 GrDrawTarget::AutoReleaseGeometry geo; // must be inside AutoCheckFlush scop e 951 GrDrawTarget::AutoReleaseGeometry geo; // must be inside AutoCheckFlush scop e
952 952
953 GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are, &acf ); 953 GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are, &acf );
954 954
955 GR_CREATE_TRACE_MARKER("GrContext::drawVertices", target); 955 GR_CREATE_TRACE_MARKER("GrContext::drawVertices", target);
956 956
957 GrDrawState* drawState = target->drawState(); 957 GrDrawState* drawState = target->drawState();
958 958
959 int colorOffset = -1, texOffset = -1; 959 int colorOffset = -1, texOffset = -1;
960 set_vertex_attributes(drawState, texCoords, colors, &colorOffset, &texOffset ); 960 set_vertex_attributes(drawState, texCoords, colors, &colorOffset, &texOffset );
961 961
962 size_t vertexSize = drawState->getVertexSize(); 962 size_t vertexSize = drawState->getVertexSize();
963 if (sizeof(GrPoint) != vertexSize) { 963 if (sizeof(SkPoint) != vertexSize) {
964 if (!geo.set(target, vertexCount, 0)) { 964 if (!geo.set(target, vertexCount, 0)) {
965 GrPrintf("Failed to get space for vertices!\n"); 965 GrPrintf("Failed to get space for vertices!\n");
966 return; 966 return;
967 } 967 }
968 void* curVertex = geo.vertices(); 968 void* curVertex = geo.vertices();
969 969
970 for (int i = 0; i < vertexCount; ++i) { 970 for (int i = 0; i < vertexCount; ++i) {
971 *((GrPoint*)curVertex) = positions[i]; 971 *((SkPoint*)curVertex) = positions[i];
972 972
973 if (texOffset >= 0) { 973 if (texOffset >= 0) {
974 *(GrPoint*)((intptr_t)curVertex + texOffset) = texCoords[i]; 974 *(SkPoint*)((intptr_t)curVertex + texOffset) = texCoords[i];
975 } 975 }
976 if (colorOffset >= 0) { 976 if (colorOffset >= 0) {
977 *(GrColor*)((intptr_t)curVertex + colorOffset) = colors[i]; 977 *(GrColor*)((intptr_t)curVertex + colorOffset) = colors[i];
978 } 978 }
979 curVertex = (void*)((intptr_t)curVertex + vertexSize); 979 curVertex = (void*)((intptr_t)curVertex + vertexSize);
980 } 980 }
981 } else { 981 } else {
982 target->setVertexSourceToArray(positions, vertexCount); 982 target->setVertexSourceToArray(positions, vertexCount);
983 } 983 }
984 984
(...skipping 800 matching lines...) Expand 10 before | Expand all | Expand 10 after
1785 } 1785 }
1786 return path; 1786 return path;
1787 } 1787 }
1788 1788
1789 /////////////////////////////////////////////////////////////////////////////// 1789 ///////////////////////////////////////////////////////////////////////////////
1790 #if GR_CACHE_STATS 1790 #if GR_CACHE_STATS
1791 void GrContext::printCacheStats() const { 1791 void GrContext::printCacheStats() const {
1792 fTextureCache->printStats(); 1792 fTextureCache->printStats();
1793 } 1793 }
1794 #endif 1794 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698