Home | History | Annotate | Download | only in gpu
      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 bool GrRenderTarget::readPixels(int left, int top, int width, int height,
     17                                 GrPixelConfig config,
     18                                 void* buffer,
     19                                 size_t rowBytes,
     20                                 uint32_t pixelOpsFlags) {
     21     // go through context so that all necessary flushing occurs
     22     GrContext* context = this->getContext();
     23     if (NULL == context) {
     24         return false;
     25     }
     26     return context->readRenderTargetPixels(this,
     27                                            left, top, width, height,
     28                                            config, buffer, rowBytes,
     29                                            pixelOpsFlags);
     30 }
     31 
     32 void GrRenderTarget::writePixels(int left, int top, int width, int height,
     33                                  GrPixelConfig config,
     34                                  const void* buffer,
     35                                  size_t rowBytes,
     36                                  uint32_t pixelOpsFlags) {
     37     // go through context so that all necessary flushing occurs
     38     GrContext* context = this->getContext();
     39     if (NULL == context) {
     40         return;
     41     }
     42     context->writeRenderTargetPixels(this,
     43                                      left, top, width, height,
     44                                      config, buffer, rowBytes,
     45                                      pixelOpsFlags);
     46 }
     47 
     48 void GrRenderTarget::resolve() {
     49     // go through context so that all necessary flushing occurs
     50     GrContext* context = this->getContext();
     51     if (NULL == context) {
     52         return;
     53     }
     54     context->resolveRenderTarget(this);
     55 }
     56 
     57 size_t GrRenderTarget::sizeInBytes() const {
     58     size_t colorBits;
     59     if (kUnknown_GrPixelConfig == fDesc.fConfig) {
     60         colorBits = 32; // don't know, make a guess
     61     } else {
     62         colorBits = GrBytesPerPixel(fDesc.fConfig);
     63     }
     64     uint64_t size = fDesc.fWidth;
     65     size *= fDesc.fHeight;
     66     size *= colorBits;
     67     size *= GrMax(1, fDesc.fSampleCnt);
     68     return (size_t)(size / 8);
     69 }
     70 
     71 void GrRenderTarget::flagAsNeedingResolve(const SkIRect* rect) {
     72     if (kCanResolve_ResolveType == getResolveType()) {
     73         if (NULL != rect) {
     74             fResolveRect.join(*rect);
     75             if (!fResolveRect.intersect(0, 0, this->width(), this->height())) {
     76                 fResolveRect.setEmpty();
     77             }
     78         } else {
     79             fResolveRect.setLTRB(0, 0, this->width(), this->height());
     80         }
     81     }
     82 }
     83 
     84 void GrRenderTarget::overrideResolveRect(const SkIRect rect) {
     85     fResolveRect = rect;
     86     if (fResolveRect.isEmpty()) {
     87         fResolveRect.setLargestInverted();
     88     } else {
     89         if (!fResolveRect.intersect(0, 0, this->width(), this->height())) {
     90             fResolveRect.setLargestInverted();
     91         }
     92     }
     93 }
     94 
     95 void GrRenderTarget::setStencilBuffer(GrStencilBuffer* stencilBuffer) {
     96     SkRefCnt_SafeAssign(fStencilBuffer, stencilBuffer);
     97 }
     98 
     99 void GrRenderTarget::onRelease() {
    100     this->setStencilBuffer(NULL);
    101 
    102     INHERITED::onRelease();
    103 }
    104 
    105 void GrRenderTarget::onAbandon() {
    106     this->setStencilBuffer(NULL);
    107 
    108     INHERITED::onAbandon();
    109 }
    110