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

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

Issue 1717393002: Add "sample locations" feature to GrProcessor (Closed) Base URL: https://skia.googlesource.com/skia.git@upload_getmultisamp
Patch Set: vk stubs Created 4 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
« no previous file with comments | « src/gpu/GrGpu.h ('k') | src/gpu/GrProgramDesc.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2010 Google Inc. 2 * Copyright 2010 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 8
9 #include "GrGpu.h" 9 #include "GrGpu.h"
10 10
(...skipping 29 matching lines...) Expand all
40 fIndexBuffer.reset(di.indexBuffer()); 40 fIndexBuffer.reset(di.indexBuffer());
41 41
42 return *this; 42 return *this;
43 } 43 }
44 44
45 //////////////////////////////////////////////////////////////////////////////// 45 ////////////////////////////////////////////////////////////////////////////////
46 46
47 GrGpu::GrGpu(GrContext* context) 47 GrGpu::GrGpu(GrContext* context)
48 : fResetTimestamp(kExpiredTimestamp+1) 48 : fResetTimestamp(kExpiredTimestamp+1)
49 , fResetBits(kAll_GrBackendState) 49 , fResetBits(kAll_GrBackendState)
50 , fMultisampleSpecsAllocator(1)
50 , fContext(context) { 51 , fContext(context) {
51 } 52 }
52 53
53 GrGpu::~GrGpu() {} 54 GrGpu::~GrGpu() {}
54 55
55 void GrGpu::contextAbandoned() {} 56 void GrGpu::contextAbandoned() {}
56 57
57 //////////////////////////////////////////////////////////////////////////////// 58 ////////////////////////////////////////////////////////////////////////////////
58 59
59 bool GrGpu::makeCopyForTextureParams(int width, int height, const GrTextureParam s& textureParams, 60 bool GrGpu::makeCopyForTextureParams(int width, int height, const GrTextureParam s& textureParams,
(...skipping 377 matching lines...) Expand 10 before | Expand all | Expand 10 after
437 } 438 }
438 return false; 439 return false;
439 } 440 }
440 441
441 void GrGpu::resolveRenderTarget(GrRenderTarget* target) { 442 void GrGpu::resolveRenderTarget(GrRenderTarget* target) {
442 SkASSERT(target); 443 SkASSERT(target);
443 this->handleDirtyContext(); 444 this->handleDirtyContext();
444 this->onResolveRenderTarget(target); 445 this->onResolveRenderTarget(target);
445 } 446 }
446 447
448 inline static uint8_t multisample_specs_id(uint8_t numSamples, GrSurfaceOrigin o rigin,
449 const GrCaps& caps) {
450 if (!caps.sampleLocationsSupport()) {
451 return numSamples;
452 }
453
454 SkASSERT(numSamples < 128);
455 SkASSERT(kTopLeft_GrSurfaceOrigin == origin || kBottomLeft_GrSurfaceOrigin = = origin);
456 return (numSamples << 1) | (origin - 1);
457
458 GR_STATIC_ASSERT(1 == kTopLeft_GrSurfaceOrigin);
459 GR_STATIC_ASSERT(2 == kBottomLeft_GrSurfaceOrigin);
460 }
461
462 const GrGpu::MultisampleSpecs& GrGpu::getMultisampleSpecs(GrRenderTarget* rt,
463 const GrStencilSetting s& stencil) {
464 const GrSurfaceDesc& desc = rt->desc();
465 uint8_t surfDescKey = multisample_specs_id(desc.fSampleCnt, desc.fOrigin, *t his->caps());
466 if (fMultisampleSpecsMap.count() > surfDescKey && fMultisampleSpecsMap[surfD escKey]) {
467 #if !defined(SK_DEBUG)
468 // In debug mode we query the multisample info every time and verify the caching is correct.
469 return *fMultisampleSpecsMap[surfDescKey];
470 #endif
471 }
472 int effectiveSampleCnt;
473 SkAutoTDeleteArray<SkPoint> locations(nullptr);
474 this->onGetMultisampleSpecs(rt, stencil, &effectiveSampleCnt, &locations);
475 SkASSERT(effectiveSampleCnt && effectiveSampleCnt >= desc.fSampleCnt);
476 uint8_t effectiveKey = multisample_specs_id(effectiveSampleCnt, desc.fOrigin , *this->caps());
477 if (fMultisampleSpecsMap.count() > effectiveKey && fMultisampleSpecsMap[effe ctiveKey]) {
478 const MultisampleSpecs& specs = *fMultisampleSpecsMap[effectiveKey];
479 SkASSERT(effectiveKey == specs.fUniqueID);
480 SkASSERT(effectiveSampleCnt == specs.fEffectiveSampleCnt);
481 SkASSERT(!this->caps()->sampleLocationsSupport() ||
482 !memcmp(locations.get(), specs.fSampleLocations.get(),
483 effectiveSampleCnt * sizeof(SkPoint)));
484 SkASSERT(surfDescKey <= effectiveKey);
485 SkASSERT(!fMultisampleSpecsMap[surfDescKey] || fMultisampleSpecsMap[surf DescKey] == &specs);
486 fMultisampleSpecsMap[surfDescKey] = &specs;
487 return specs;
488 }
489 const MultisampleSpecs& specs = *new (&fMultisampleSpecsAllocator)
490 MultisampleSpecs{effectiveKey, effectiveSampleCnt, locations.detach()};
491 if (fMultisampleSpecsMap.count() <= effectiveKey) {
492 int n = 1 + effectiveKey - fMultisampleSpecsMap.count();
493 fMultisampleSpecsMap.push_back_n(n, (const MultisampleSpecs*) nullptr);
494 }
495 fMultisampleSpecsMap[effectiveKey] = &specs;
496 if (effectiveSampleCnt != desc.fSampleCnt) {
497 SkASSERT(surfDescKey < effectiveKey);
498 fMultisampleSpecsMap[surfDescKey] = &specs;
499 }
500 return specs;
501 }
502
447 //////////////////////////////////////////////////////////////////////////////// 503 ////////////////////////////////////////////////////////////////////////////////
448 504
449 void GrGpu::draw(const DrawArgs& args, const GrVertices& vertices) { 505 void GrGpu::draw(const DrawArgs& args, const GrVertices& vertices) {
450 this->handleDirtyContext(); 506 this->handleDirtyContext();
451 if (GrXferBarrierType barrierType = args.fPipeline->xferBarrierType(*this->c aps())) { 507 if (GrXferBarrierType barrierType = args.fPipeline->xferBarrierType(*this->c aps())) {
452 this->xferBarrier(args.fPipeline->getRenderTarget(), barrierType); 508 this->xferBarrier(args.fPipeline->getRenderTarget(), barrierType);
453 } 509 }
454 510
455 GrVertices::Iterator iter; 511 GrVertices::Iterator iter;
456 const GrNonInstancedVertices* verts = iter.init(vertices); 512 const GrNonInstancedVertices* verts = iter.init(vertices);
457 do { 513 do {
458 this->onDraw(args, *verts); 514 this->onDraw(args, *verts);
459 fStats.incNumDraws(); 515 fStats.incNumDraws();
460 } while ((verts = iter.next())); 516 } while ((verts = iter.next()));
461 } 517 }
462 518
OLDNEW
« no previous file with comments | « src/gpu/GrGpu.h ('k') | src/gpu/GrProgramDesc.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698