1 2 /* 3 * Copyright 2011 Google Inc. 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8 9 10 #include "GrRenderTarget.h" 11 12 #include "GrContext.h" 13 #include "GrGpu.h" 14 #include "GrStencilBuffer.h" 15 16 SK_DEFINE_INST_COUNT(GrRenderTarget) 17 18 bool GrRenderTarget::readPixels(int left, int top, int width, int height, 19 GrPixelConfig config, 20 void* buffer, 21 size_t rowBytes, 22 uint32_t pixelOpsFlags) { 23 // go through context so that all necessary flushing occurs 24 GrContext* context = this->getContext(); 25 if (NULL == context) { 26 return false; 27 } 28 return context->readRenderTargetPixels(this, 29 left, top, width, height, 30 config, buffer, rowBytes, 31 pixelOpsFlags); 32 } 33 34 void GrRenderTarget::writePixels(int left, int top, int width, int height, 35 GrPixelConfig config, 36 const void* buffer, 37 size_t rowBytes, 38 uint32_t pixelOpsFlags) { 39 // go through context so that all necessary flushing occurs 40 GrContext* context = this->getContext(); 41 if (NULL == context) { 42 return; 43 } 44 context->writeRenderTargetPixels(this, 45 left, top, width, height, 46 config, buffer, rowBytes, 47 pixelOpsFlags); 48 } 49 50 void GrRenderTarget::resolve() { 51 // go through context so that all necessary flushing occurs 52 GrContext* context = this->getContext(); 53 if (NULL == context) { 54 return; 55 } 56 context->resolveRenderTarget(this); 57 } 58 59 size_t GrRenderTarget::sizeInBytes() const { 60 int colorBits; 61 if (kUnknown_GrPixelConfig == fDesc.fConfig) { 62 colorBits = 32; // don't know, make a guess 63 } else { 64 colorBits = GrBytesPerPixel(fDesc.fConfig); 65 } 66 uint64_t size = fDesc.fWidth; 67 size *= fDesc.fHeight; 68 size *= colorBits; 69 size *= GrMax(1, fDesc.fSampleCnt); 70 return (size_t)(size / 8); 71 } 72 73 void GrRenderTarget::flagAsNeedingResolve(const GrIRect* rect) { 74 if (kCanResolve_ResolveType == getResolveType()) { 75 if (NULL != rect) { 76 fResolveRect.join(*rect); 77 if (!fResolveRect.intersect(0, 0, this->width(), this->height())) { 78 fResolveRect.setEmpty(); 79 } 80 } else { 81 fResolveRect.setLTRB(0, 0, this->width(), this->height()); 82 } 83 } 84 } 85 86 void GrRenderTarget::overrideResolveRect(const GrIRect rect) { 87 fResolveRect = rect; 88 if (fResolveRect.isEmpty()) { 89 fResolveRect.setLargestInverted(); 90 } else { 91 if (!fResolveRect.intersect(0, 0, this->width(), this->height())) { 92 fResolveRect.setLargestInverted(); 93 } 94 } 95 } 96 97 void GrRenderTarget::setStencilBuffer(GrStencilBuffer* stencilBuffer) { 98 if (stencilBuffer == fStencilBuffer) { 99 return; 100 } 101 102 if (NULL != fStencilBuffer) { 103 fStencilBuffer->unref(); 104 105 GrContext* context = this->getContext(); 106 if (NULL != context) { 107 context->purgeCache(); 108 } 109 110 if (NULL != context) { 111 context->purgeCache(); 112 } 113 } 114 115 fStencilBuffer = stencilBuffer; 116 117 if (NULL != fStencilBuffer) { 118 fStencilBuffer->ref(); 119 } 120 } 121 122 void GrRenderTarget::onRelease() { 123 this->setStencilBuffer(NULL); 124 125 INHERITED::onRelease(); 126 } 127 128 void GrRenderTarget::onAbandon() { 129 this->setStencilBuffer(NULL); 130 131 INHERITED::onAbandon(); 132 } 133