bsalomon | 7539856 | 2015-08-17 12:55:38 -0700 | [diff] [blame] | 1 | /* |
| 2 | * Copyright 2015 Google Inc. |
| 3 | * |
| 4 | * Use of this source code is governed by a BSD-style license that can be |
| 5 | * found in the LICENSE file. |
| 6 | */ |
| 7 | |
Brian Salomon | 742e31d | 2016-12-07 17:06:19 -0500 | [diff] [blame] | 8 | #include "GrOpFlushState.h" |
bsalomon | 7539856 | 2015-08-17 12:55:38 -0700 | [diff] [blame] | 9 | |
Brian Salomon | 903da79 | 2016-12-16 14:24:46 -0500 | [diff] [blame] | 10 | #include "GrDrawOpAtlas.h" |
Robert Phillips | 646e429 | 2017-06-13 12:44:56 -0400 | [diff] [blame] | 11 | #include "GrGpu.h" |
Brian Salomon | 9bada54 | 2017-06-12 12:09:30 -0400 | [diff] [blame] | 12 | #include "GrResourceProvider.h" |
Robert Phillips | 646e429 | 2017-06-13 12:44:56 -0400 | [diff] [blame] | 13 | #include "GrTexture.h" |
bsalomon | 7539856 | 2015-08-17 12:55:38 -0700 | [diff] [blame] | 14 | |
Brian Salomon | 742e31d | 2016-12-07 17:06:19 -0500 | [diff] [blame] | 15 | GrOpFlushState::GrOpFlushState(GrGpu* gpu, GrResourceProvider* resourceProvider) |
Brian Salomon | 54d212e | 2017-03-21 14:22:38 -0400 | [diff] [blame] | 16 | : fGpu(gpu) |
| 17 | , fResourceProvider(resourceProvider) |
| 18 | , fCommandBuffer(nullptr) |
| 19 | , fVertexPool(gpu) |
| 20 | , fIndexPool(gpu) |
| 21 | , fLastIssuedToken(GrDrawOpUploadToken::AlreadyFlushedToken()) |
| 22 | , fLastFlushedToken(0) |
| 23 | , fOpArgs(nullptr) {} |
bsalomon | 7539856 | 2015-08-17 12:55:38 -0700 | [diff] [blame] | 24 | |
Robert Phillips | 646e429 | 2017-06-13 12:44:56 -0400 | [diff] [blame] | 25 | const GrCaps& GrOpFlushState::caps() const { |
| 26 | return *fGpu->caps(); |
| 27 | } |
| 28 | |
Brian Salomon | 742e31d | 2016-12-07 17:06:19 -0500 | [diff] [blame] | 29 | void* GrOpFlushState::makeVertexSpace(size_t vertexSize, int vertexCount, |
cdalton | 397536c | 2016-03-25 12:15:03 -0700 | [diff] [blame] | 30 | const GrBuffer** buffer, int* startVertex) { |
bsalomon | 7539856 | 2015-08-17 12:55:38 -0700 | [diff] [blame] | 31 | return fVertexPool.makeSpace(vertexSize, vertexCount, buffer, startVertex); |
| 32 | } |
| 33 | |
Brian Salomon | 742e31d | 2016-12-07 17:06:19 -0500 | [diff] [blame] | 34 | uint16_t* GrOpFlushState::makeIndexSpace(int indexCount, |
cdalton | 397536c | 2016-03-25 12:15:03 -0700 | [diff] [blame] | 35 | const GrBuffer** buffer, int* startIndex) { |
bsalomon | 7539856 | 2015-08-17 12:55:38 -0700 | [diff] [blame] | 36 | return reinterpret_cast<uint16_t*>(fIndexPool.makeSpace(indexCount, buffer, startIndex)); |
| 37 | } |
Brian Salomon | 9bada54 | 2017-06-12 12:09:30 -0400 | [diff] [blame] | 38 | |
Brian Osman | 49b7b6f | 2017-06-20 14:43:58 -0400 | [diff] [blame] | 39 | void* GrOpFlushState::makeVertexSpaceAtLeast(size_t vertexSize, int minVertexCount, |
| 40 | int fallbackVertexCount, const GrBuffer** buffer, |
| 41 | int* startVertex, int* actualVertexCount) { |
| 42 | return fVertexPool.makeSpaceAtLeast(vertexSize, minVertexCount, fallbackVertexCount, buffer, |
| 43 | startVertex, actualVertexCount); |
| 44 | } |
| 45 | |
| 46 | uint16_t* GrOpFlushState::makeIndexSpaceAtLeast(int minIndexCount, int fallbackIndexCount, |
| 47 | const GrBuffer** buffer, int* startIndex, |
| 48 | int* actualIndexCount) { |
| 49 | return reinterpret_cast<uint16_t*>(fIndexPool.makeSpaceAtLeast( |
| 50 | minIndexCount, fallbackIndexCount, buffer, startIndex, actualIndexCount)); |
| 51 | } |
| 52 | |
Brian Salomon | 9bada54 | 2017-06-12 12:09:30 -0400 | [diff] [blame] | 53 | void GrOpFlushState::doUpload(GrDrawOp::DeferredUploadFn& upload) { |
Robert Phillips | acaa607 | 2017-07-28 10:54:53 -0400 | [diff] [blame] | 54 | GrDrawOp::WritePixelsFn wp = [this](GrTextureProxy* proxy, |
| 55 | int left, int top, int width, |
Brian Salomon | 9bada54 | 2017-06-12 12:09:30 -0400 | [diff] [blame] | 56 | int height, GrPixelConfig config, const void* buffer, |
| 57 | size_t rowBytes) { |
Robert Phillips | acaa607 | 2017-07-28 10:54:53 -0400 | [diff] [blame] | 58 | GrSurface* surface = proxy->priv().peekSurface(); |
Brian Salomon | 9bada54 | 2017-06-12 12:09:30 -0400 | [diff] [blame] | 59 | GrGpu::DrawPreference drawPreference = GrGpu::kNoDraw_DrawPreference; |
| 60 | GrGpu::WritePixelTempDrawInfo tempInfo; |
Robert Phillips | 7294b85 | 2017-08-01 13:51:44 +0000 | [diff] [blame] | 61 | fGpu->getWritePixelsInfo(surface, width, height, proxy->config(), |
Robert Phillips | acaa607 | 2017-07-28 10:54:53 -0400 | [diff] [blame] | 62 | &drawPreference, &tempInfo); |
Brian Salomon | 9bada54 | 2017-06-12 12:09:30 -0400 | [diff] [blame] | 63 | if (GrGpu::kNoDraw_DrawPreference == drawPreference) { |
Robert Phillips | 7294b85 | 2017-08-01 13:51:44 +0000 | [diff] [blame] | 64 | return this->fGpu->writePixels(surface, left, top, width, height, |
Robert Phillips | acaa607 | 2017-07-28 10:54:53 -0400 | [diff] [blame] | 65 | config, buffer, rowBytes); |
Brian Salomon | 9bada54 | 2017-06-12 12:09:30 -0400 | [diff] [blame] | 66 | } |
| 67 | GrSurfaceDesc desc; |
Robert Phillips | acaa607 | 2017-07-28 10:54:53 -0400 | [diff] [blame] | 68 | desc.fOrigin = proxy->origin(); |
Brian Salomon | 9bada54 | 2017-06-12 12:09:30 -0400 | [diff] [blame] | 69 | desc.fWidth = width; |
| 70 | desc.fHeight = height; |
Robert Phillips | acaa607 | 2017-07-28 10:54:53 -0400 | [diff] [blame] | 71 | desc.fConfig = proxy->config(); |
Brian Salomon | 9bada54 | 2017-06-12 12:09:30 -0400 | [diff] [blame] | 72 | sk_sp<GrTexture> temp(this->fResourceProvider->createApproxTexture( |
| 73 | desc, GrResourceProvider::kNoPendingIO_Flag)); |
| 74 | if (!temp) { |
| 75 | return false; |
| 76 | } |
Robert Phillips | 7294b85 | 2017-08-01 13:51:44 +0000 | [diff] [blame] | 77 | if (!fGpu->writePixels(temp.get(), 0, 0, width, height, desc.fConfig, |
Robert Phillips | acaa607 | 2017-07-28 10:54:53 -0400 | [diff] [blame] | 78 | buffer, rowBytes)) { |
Brian Salomon | 9bada54 | 2017-06-12 12:09:30 -0400 | [diff] [blame] | 79 | return false; |
| 80 | } |
Robert Phillips | 7294b85 | 2017-08-01 13:51:44 +0000 | [diff] [blame] | 81 | return fGpu->copySurface(surface, temp.get(), |
Robert Phillips | acaa607 | 2017-07-28 10:54:53 -0400 | [diff] [blame] | 82 | SkIRect::MakeWH(width, height), {left, top}); |
Brian Salomon | 9bada54 | 2017-06-12 12:09:30 -0400 | [diff] [blame] | 83 | }; |
| 84 | upload(wp); |
| 85 | } |