GrRenderTarget.cpp revision fd03d4a829efe2d77a712fd991927c55f59a2ffe
1aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com 2aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com/* 3aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com * Copyright 2011 Google Inc. 4aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com * 5aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com * Use of this source code is governed by a BSD-style license that can be 6aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com * found in the LICENSE file. 7aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com */ 8aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com 9aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com 10aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com#include "GrRenderTarget.h" 11aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com 12aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com#include "GrContext.h" 13aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com#include "GrGpu.h" 1481c3f8de1cbb93a8b99d730a75ab16d864612e95bsalomon@google.com#include "GrStencilBuffer.h" 15aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com 164d73ac22a1b99402fc8cff78a4eb4b27aa8fe019robertphillips@google.comSK_DEFINE_INST_COUNT(GrRenderTarget) 174d73ac22a1b99402fc8cff78a4eb4b27aa8fe019robertphillips@google.com 18aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.combool GrRenderTarget::readPixels(int left, int top, int width, int height, 190342a85091fd430c90a142d155dc9642aa729d9ebsalomon@google.com GrPixelConfig config, 200342a85091fd430c90a142d155dc9642aa729d9ebsalomon@google.com void* buffer, 210342a85091fd430c90a142d155dc9642aa729d9ebsalomon@google.com size_t rowBytes, 220342a85091fd430c90a142d155dc9642aa729d9ebsalomon@google.com uint32_t pixelOpsFlags) { 23aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com // go through context so that all necessary flushing occurs 246f3795105b2b458079e53a721c1735c9518f6bb5bsalomon@google.com GrContext* context = this->getContext(); 256f3795105b2b458079e53a721c1735c9518f6bb5bsalomon@google.com if (NULL == context) { 266f3795105b2b458079e53a721c1735c9518f6bb5bsalomon@google.com return false; 276f3795105b2b458079e53a721c1735c9518f6bb5bsalomon@google.com } 28aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com return context->readRenderTargetPixels(this, 290342a85091fd430c90a142d155dc9642aa729d9ebsalomon@google.com left, top, width, height, 300342a85091fd430c90a142d155dc9642aa729d9ebsalomon@google.com config, buffer, rowBytes, 310342a85091fd430c90a142d155dc9642aa729d9ebsalomon@google.com pixelOpsFlags); 326f3795105b2b458079e53a721c1735c9518f6bb5bsalomon@google.com} 336f3795105b2b458079e53a721c1735c9518f6bb5bsalomon@google.com 346f3795105b2b458079e53a721c1735c9518f6bb5bsalomon@google.comvoid GrRenderTarget::writePixels(int left, int top, int width, int height, 350342a85091fd430c90a142d155dc9642aa729d9ebsalomon@google.com GrPixelConfig config, 360342a85091fd430c90a142d155dc9642aa729d9ebsalomon@google.com const void* buffer, 370342a85091fd430c90a142d155dc9642aa729d9ebsalomon@google.com size_t rowBytes, 380342a85091fd430c90a142d155dc9642aa729d9ebsalomon@google.com uint32_t pixelOpsFlags) { 396f3795105b2b458079e53a721c1735c9518f6bb5bsalomon@google.com // go through context so that all necessary flushing occurs 406f3795105b2b458079e53a721c1735c9518f6bb5bsalomon@google.com GrContext* context = this->getContext(); 416f3795105b2b458079e53a721c1735c9518f6bb5bsalomon@google.com if (NULL == context) { 426f3795105b2b458079e53a721c1735c9518f6bb5bsalomon@google.com return; 436f3795105b2b458079e53a721c1735c9518f6bb5bsalomon@google.com } 446f3795105b2b458079e53a721c1735c9518f6bb5bsalomon@google.com context->writeRenderTargetPixels(this, 450342a85091fd430c90a142d155dc9642aa729d9ebsalomon@google.com left, top, width, height, 460342a85091fd430c90a142d155dc9642aa729d9ebsalomon@google.com config, buffer, rowBytes, 470342a85091fd430c90a142d155dc9642aa729d9ebsalomon@google.com pixelOpsFlags); 48aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com} 49aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com 5075f9f25d8bf2adc0494f9afbbd5965809ee13acabsalomon@google.comvoid GrRenderTarget::resolve() { 5175f9f25d8bf2adc0494f9afbbd5965809ee13acabsalomon@google.com // go through context so that all necessary flushing occurs 5275f9f25d8bf2adc0494f9afbbd5965809ee13acabsalomon@google.com GrContext* context = this->getContext(); 5375f9f25d8bf2adc0494f9afbbd5965809ee13acabsalomon@google.com if (NULL == context) { 5475f9f25d8bf2adc0494f9afbbd5965809ee13acabsalomon@google.com return; 5575f9f25d8bf2adc0494f9afbbd5965809ee13acabsalomon@google.com } 5675f9f25d8bf2adc0494f9afbbd5965809ee13acabsalomon@google.com context->resolveRenderTarget(this); 5775f9f25d8bf2adc0494f9afbbd5965809ee13acabsalomon@google.com} 5875f9f25d8bf2adc0494f9afbbd5965809ee13acabsalomon@google.com 59aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.comsize_t GrRenderTarget::sizeInBytes() const { 60aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com int colorBits; 61e98ade4fdee03a234f68669bea84d07db4a8527erobertphillips@google.com if (kUnknown_GrPixelConfig == fDesc.fConfig) { 62aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com colorBits = 32; // don't know, make a guess 63aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com } else { 64e98ade4fdee03a234f68669bea84d07db4a8527erobertphillips@google.com colorBits = GrBytesPerPixel(fDesc.fConfig); 65aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com } 66e98ade4fdee03a234f68669bea84d07db4a8527erobertphillips@google.com uint64_t size = fDesc.fWidth; 67e98ade4fdee03a234f68669bea84d07db4a8527erobertphillips@google.com size *= fDesc.fHeight; 68f6ff4951f7cf40fab078eb8016ceb7f53b8ec81ebsalomon@google.com size *= colorBits; 69e98ade4fdee03a234f68669bea84d07db4a8527erobertphillips@google.com size *= GrMax(1, fDesc.fSampleCnt); 70f6ff4951f7cf40fab078eb8016ceb7f53b8ec81ebsalomon@google.com return (size_t)(size / 8); 71aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com} 72aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com 73fd03d4a829efe2d77a712fd991927c55f59a2ffecommit-bot@chromium.orgvoid GrRenderTarget::flagAsNeedingResolve(const SkIRect* rect) { 74aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com if (kCanResolve_ResolveType == getResolveType()) { 75aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com if (NULL != rect) { 76aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com fResolveRect.join(*rect); 77aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com if (!fResolveRect.intersect(0, 0, this->width(), this->height())) { 78aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com fResolveRect.setEmpty(); 79aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com } 80aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com } else { 81aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com fResolveRect.setLTRB(0, 0, this->width(), this->height()); 82aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com } 83aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com } 84aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com} 85aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com 86fd03d4a829efe2d77a712fd991927c55f59a2ffecommit-bot@chromium.orgvoid GrRenderTarget::overrideResolveRect(const SkIRect rect) { 87aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com fResolveRect = rect; 88aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com if (fResolveRect.isEmpty()) { 89aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com fResolveRect.setLargestInverted(); 90aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com } else { 91aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com if (!fResolveRect.intersect(0, 0, this->width(), this->height())) { 92aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com fResolveRect.setLargestInverted(); 93aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com } 94aa5b6730f2658618015ed56ffb5882f15b6f053fbsalomon@google.com } 9581c3f8de1cbb93a8b99d730a75ab16d864612e95bsalomon@google.com} 9681c3f8de1cbb93a8b99d730a75ab16d864612e95bsalomon@google.com 9781c3f8de1cbb93a8b99d730a75ab16d864612e95bsalomon@google.comvoid GrRenderTarget::setStencilBuffer(GrStencilBuffer* stencilBuffer) { 9876202b8dc39652b2832b279fc4cb798a0ea03ed3bsalomon@google.com SkRefCnt_SafeAssign(fStencilBuffer, stencilBuffer); 99f6ff4951f7cf40fab078eb8016ceb7f53b8ec81ebsalomon@google.com} 100d6bbbf8a831cc982cda9b91e84c5600c631af5b2robertphillips@google.com 101d6bbbf8a831cc982cda9b91e84c5600c631af5b2robertphillips@google.comvoid GrRenderTarget::onRelease() { 102d6bbbf8a831cc982cda9b91e84c5600c631af5b2robertphillips@google.com this->setStencilBuffer(NULL); 103d364554bcfd391c3b6111af8bff963a35ab87ba7robertphillips@google.com 104d364554bcfd391c3b6111af8bff963a35ab87ba7robertphillips@google.com INHERITED::onRelease(); 105d6bbbf8a831cc982cda9b91e84c5600c631af5b2robertphillips@google.com} 106d6bbbf8a831cc982cda9b91e84c5600c631af5b2robertphillips@google.com 107d6bbbf8a831cc982cda9b91e84c5600c631af5b2robertphillips@google.comvoid GrRenderTarget::onAbandon() { 108d6bbbf8a831cc982cda9b91e84c5600c631af5b2robertphillips@google.com this->setStencilBuffer(NULL); 109d364554bcfd391c3b6111af8bff963a35ab87ba7robertphillips@google.com 110d364554bcfd391c3b6111af8bff963a35ab87ba7robertphillips@google.com INHERITED::onAbandon(); 111d6bbbf8a831cc982cda9b91e84c5600c631af5b2robertphillips@google.com} 112