17539856c1b9cbb1886a6a498cc534b77fc83ddb2bsalomon/* 27539856c1b9cbb1886a6a498cc534b77fc83ddb2bsalomon * Copyright 2015 Google Inc. 37539856c1b9cbb1886a6a498cc534b77fc83ddb2bsalomon * 47539856c1b9cbb1886a6a498cc534b77fc83ddb2bsalomon * Use of this source code is governed by a BSD-style license that can be 57539856c1b9cbb1886a6a498cc534b77fc83ddb2bsalomon * found in the LICENSE file. 67539856c1b9cbb1886a6a498cc534b77fc83ddb2bsalomon */ 77539856c1b9cbb1886a6a498cc534b77fc83ddb2bsalomon 8742e31de1599f3902810aecdf2e2e3eed3b40a09Brian Salomon#include "GrOpFlushState.h" 97539856c1b9cbb1886a6a498cc534b77fc83ddb2bsalomon 10903da79a19c35723ff198d56923250d5f3fe0f15Brian Salomon#include "GrDrawOpAtlas.h" 11646e4293f06d9de6d44dbfa3c32cdc15a6f5906eRobert Phillips#include "GrGpu.h" 129bada5475f11c796a4e10845d86068218fa84bc8Brian Salomon#include "GrResourceProvider.h" 13646e4293f06d9de6d44dbfa3c32cdc15a6f5906eRobert Phillips#include "GrTexture.h" 147539856c1b9cbb1886a6a498cc534b77fc83ddb2bsalomon 15742e31de1599f3902810aecdf2e2e3eed3b40a09Brian SalomonGrOpFlushState::GrOpFlushState(GrGpu* gpu, GrResourceProvider* resourceProvider) 1654d212e1bfaea0be88c3c40820d0b1ae0daebecfBrian Salomon : fGpu(gpu) 1754d212e1bfaea0be88c3c40820d0b1ae0daebecfBrian Salomon , fResourceProvider(resourceProvider) 1854d212e1bfaea0be88c3c40820d0b1ae0daebecfBrian Salomon , fCommandBuffer(nullptr) 1954d212e1bfaea0be88c3c40820d0b1ae0daebecfBrian Salomon , fVertexPool(gpu) 2054d212e1bfaea0be88c3c40820d0b1ae0daebecfBrian Salomon , fIndexPool(gpu) 2154d212e1bfaea0be88c3c40820d0b1ae0daebecfBrian Salomon , fLastIssuedToken(GrDrawOpUploadToken::AlreadyFlushedToken()) 2254d212e1bfaea0be88c3c40820d0b1ae0daebecfBrian Salomon , fLastFlushedToken(0) 2354d212e1bfaea0be88c3c40820d0b1ae0daebecfBrian Salomon , fOpArgs(nullptr) {} 247539856c1b9cbb1886a6a498cc534b77fc83ddb2bsalomon 25646e4293f06d9de6d44dbfa3c32cdc15a6f5906eRobert Phillipsconst GrCaps& GrOpFlushState::caps() const { 26646e4293f06d9de6d44dbfa3c32cdc15a6f5906eRobert Phillips return *fGpu->caps(); 27646e4293f06d9de6d44dbfa3c32cdc15a6f5906eRobert Phillips} 28646e4293f06d9de6d44dbfa3c32cdc15a6f5906eRobert Phillips 29742e31de1599f3902810aecdf2e2e3eed3b40a09Brian Salomonvoid* GrOpFlushState::makeVertexSpace(size_t vertexSize, int vertexCount, 30397536cabe12a9936659870dd220c869789424bacdalton const GrBuffer** buffer, int* startVertex) { 317539856c1b9cbb1886a6a498cc534b77fc83ddb2bsalomon return fVertexPool.makeSpace(vertexSize, vertexCount, buffer, startVertex); 327539856c1b9cbb1886a6a498cc534b77fc83ddb2bsalomon} 337539856c1b9cbb1886a6a498cc534b77fc83ddb2bsalomon 34742e31de1599f3902810aecdf2e2e3eed3b40a09Brian Salomonuint16_t* GrOpFlushState::makeIndexSpace(int indexCount, 35397536cabe12a9936659870dd220c869789424bacdalton const GrBuffer** buffer, int* startIndex) { 367539856c1b9cbb1886a6a498cc534b77fc83ddb2bsalomon return reinterpret_cast<uint16_t*>(fIndexPool.makeSpace(indexCount, buffer, startIndex)); 377539856c1b9cbb1886a6a498cc534b77fc83ddb2bsalomon} 389bada5475f11c796a4e10845d86068218fa84bc8Brian Salomon 3949b7b6f38fc9d6cbcfa5865db364ff79c3ed7bfeBrian Osmanvoid* GrOpFlushState::makeVertexSpaceAtLeast(size_t vertexSize, int minVertexCount, 4049b7b6f38fc9d6cbcfa5865db364ff79c3ed7bfeBrian Osman int fallbackVertexCount, const GrBuffer** buffer, 4149b7b6f38fc9d6cbcfa5865db364ff79c3ed7bfeBrian Osman int* startVertex, int* actualVertexCount) { 4249b7b6f38fc9d6cbcfa5865db364ff79c3ed7bfeBrian Osman return fVertexPool.makeSpaceAtLeast(vertexSize, minVertexCount, fallbackVertexCount, buffer, 4349b7b6f38fc9d6cbcfa5865db364ff79c3ed7bfeBrian Osman startVertex, actualVertexCount); 4449b7b6f38fc9d6cbcfa5865db364ff79c3ed7bfeBrian Osman} 4549b7b6f38fc9d6cbcfa5865db364ff79c3ed7bfeBrian Osman 4649b7b6f38fc9d6cbcfa5865db364ff79c3ed7bfeBrian Osmanuint16_t* GrOpFlushState::makeIndexSpaceAtLeast(int minIndexCount, int fallbackIndexCount, 4749b7b6f38fc9d6cbcfa5865db364ff79c3ed7bfeBrian Osman const GrBuffer** buffer, int* startIndex, 4849b7b6f38fc9d6cbcfa5865db364ff79c3ed7bfeBrian Osman int* actualIndexCount) { 4949b7b6f38fc9d6cbcfa5865db364ff79c3ed7bfeBrian Osman return reinterpret_cast<uint16_t*>(fIndexPool.makeSpaceAtLeast( 5049b7b6f38fc9d6cbcfa5865db364ff79c3ed7bfeBrian Osman minIndexCount, fallbackIndexCount, buffer, startIndex, actualIndexCount)); 5149b7b6f38fc9d6cbcfa5865db364ff79c3ed7bfeBrian Osman} 5249b7b6f38fc9d6cbcfa5865db364ff79c3ed7bfeBrian Osman 539bada5475f11c796a4e10845d86068218fa84bc8Brian Salomonvoid GrOpFlushState::doUpload(GrDrawOp::DeferredUploadFn& upload) { 549bada5475f11c796a4e10845d86068218fa84bc8Brian Salomon GrDrawOp::WritePixelsFn wp = [this](GrSurface* surface, int left, int top, int width, 559bada5475f11c796a4e10845d86068218fa84bc8Brian Salomon int height, GrPixelConfig config, const void* buffer, 569bada5475f11c796a4e10845d86068218fa84bc8Brian Salomon size_t rowBytes) { 579bada5475f11c796a4e10845d86068218fa84bc8Brian Salomon GrGpu::DrawPreference drawPreference = GrGpu::kNoDraw_DrawPreference; 589bada5475f11c796a4e10845d86068218fa84bc8Brian Salomon GrGpu::WritePixelTempDrawInfo tempInfo; 599bada5475f11c796a4e10845d86068218fa84bc8Brian Salomon fGpu->getWritePixelsInfo(surface, width, height, surface->config(), &drawPreference, 609bada5475f11c796a4e10845d86068218fa84bc8Brian Salomon &tempInfo); 619bada5475f11c796a4e10845d86068218fa84bc8Brian Salomon if (GrGpu::kNoDraw_DrawPreference == drawPreference) { 629bada5475f11c796a4e10845d86068218fa84bc8Brian Salomon return this->fGpu->writePixels(surface, left, top, width, height, config, buffer, 639bada5475f11c796a4e10845d86068218fa84bc8Brian Salomon rowBytes); 649bada5475f11c796a4e10845d86068218fa84bc8Brian Salomon } 659bada5475f11c796a4e10845d86068218fa84bc8Brian Salomon GrSurfaceDesc desc; 669bada5475f11c796a4e10845d86068218fa84bc8Brian Salomon desc.fConfig = surface->config(); 679bada5475f11c796a4e10845d86068218fa84bc8Brian Salomon desc.fWidth = width; 689bada5475f11c796a4e10845d86068218fa84bc8Brian Salomon desc.fHeight = height; 699bada5475f11c796a4e10845d86068218fa84bc8Brian Salomon desc.fOrigin = surface->origin(); 709bada5475f11c796a4e10845d86068218fa84bc8Brian Salomon sk_sp<GrTexture> temp(this->fResourceProvider->createApproxTexture( 719bada5475f11c796a4e10845d86068218fa84bc8Brian Salomon desc, GrResourceProvider::kNoPendingIO_Flag)); 729bada5475f11c796a4e10845d86068218fa84bc8Brian Salomon if (!temp) { 739bada5475f11c796a4e10845d86068218fa84bc8Brian Salomon return false; 749bada5475f11c796a4e10845d86068218fa84bc8Brian Salomon } 759bada5475f11c796a4e10845d86068218fa84bc8Brian Salomon if (!fGpu->writePixels(temp.get(), 0, 0, width, height, desc.fConfig, buffer, rowBytes)) { 769bada5475f11c796a4e10845d86068218fa84bc8Brian Salomon return false; 779bada5475f11c796a4e10845d86068218fa84bc8Brian Salomon } 789bada5475f11c796a4e10845d86068218fa84bc8Brian Salomon return fGpu->copySurface(surface, temp.get(), SkIRect::MakeWH(width, height), {left, top}); 799bada5475f11c796a4e10845d86068218fa84bc8Brian Salomon }; 809bada5475f11c796a4e10845d86068218fa84bc8Brian Salomon upload(wp); 819bada5475f11c796a4e10845d86068218fa84bc8Brian Salomon} 82