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