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 | |
Greg Daniel | 500d58b | 2017-08-24 15:59:33 -0400 | [diff] [blame^] | 29 | GrGpuRTCommandBuffer* GrOpFlushState::rtCommandBuffer() { |
| 30 | return fCommandBuffer->asRTCommandBuffer(); |
| 31 | } |
| 32 | |
Brian Salomon | 742e31d | 2016-12-07 17:06:19 -0500 | [diff] [blame] | 33 | void* GrOpFlushState::makeVertexSpace(size_t vertexSize, int vertexCount, |
cdalton | 397536c | 2016-03-25 12:15:03 -0700 | [diff] [blame] | 34 | const GrBuffer** buffer, int* startVertex) { |
bsalomon | 7539856 | 2015-08-17 12:55:38 -0700 | [diff] [blame] | 35 | return fVertexPool.makeSpace(vertexSize, vertexCount, buffer, startVertex); |
| 36 | } |
| 37 | |
Brian Salomon | 742e31d | 2016-12-07 17:06:19 -0500 | [diff] [blame] | 38 | uint16_t* GrOpFlushState::makeIndexSpace(int indexCount, |
cdalton | 397536c | 2016-03-25 12:15:03 -0700 | [diff] [blame] | 39 | const GrBuffer** buffer, int* startIndex) { |
bsalomon | 7539856 | 2015-08-17 12:55:38 -0700 | [diff] [blame] | 40 | return reinterpret_cast<uint16_t*>(fIndexPool.makeSpace(indexCount, buffer, startIndex)); |
| 41 | } |
Brian Salomon | 9bada54 | 2017-06-12 12:09:30 -0400 | [diff] [blame] | 42 | |
Brian Osman | 49b7b6f | 2017-06-20 14:43:58 -0400 | [diff] [blame] | 43 | void* GrOpFlushState::makeVertexSpaceAtLeast(size_t vertexSize, int minVertexCount, |
| 44 | int fallbackVertexCount, const GrBuffer** buffer, |
| 45 | int* startVertex, int* actualVertexCount) { |
| 46 | return fVertexPool.makeSpaceAtLeast(vertexSize, minVertexCount, fallbackVertexCount, buffer, |
| 47 | startVertex, actualVertexCount); |
| 48 | } |
| 49 | |
| 50 | uint16_t* GrOpFlushState::makeIndexSpaceAtLeast(int minIndexCount, int fallbackIndexCount, |
| 51 | const GrBuffer** buffer, int* startIndex, |
| 52 | int* actualIndexCount) { |
| 53 | return reinterpret_cast<uint16_t*>(fIndexPool.makeSpaceAtLeast( |
| 54 | minIndexCount, fallbackIndexCount, buffer, startIndex, actualIndexCount)); |
| 55 | } |
| 56 | |
Brian Salomon | 9bada54 | 2017-06-12 12:09:30 -0400 | [diff] [blame] | 57 | void GrOpFlushState::doUpload(GrDrawOp::DeferredUploadFn& upload) { |
Robert Phillips | acaa607 | 2017-07-28 10:54:53 -0400 | [diff] [blame] | 58 | GrDrawOp::WritePixelsFn wp = [this](GrTextureProxy* proxy, |
| 59 | int left, int top, int width, |
Brian Salomon | 9bada54 | 2017-06-12 12:09:30 -0400 | [diff] [blame] | 60 | int height, GrPixelConfig config, const void* buffer, |
| 61 | size_t rowBytes) { |
Robert Phillips | acaa607 | 2017-07-28 10:54:53 -0400 | [diff] [blame] | 62 | GrSurface* surface = proxy->priv().peekSurface(); |
Brian Salomon | 9bada54 | 2017-06-12 12:09:30 -0400 | [diff] [blame] | 63 | GrGpu::DrawPreference drawPreference = GrGpu::kNoDraw_DrawPreference; |
| 64 | GrGpu::WritePixelTempDrawInfo tempInfo; |
Robert Phillips | 7294b85 | 2017-08-01 13:51:44 +0000 | [diff] [blame] | 65 | fGpu->getWritePixelsInfo(surface, width, height, proxy->config(), |
Robert Phillips | acaa607 | 2017-07-28 10:54:53 -0400 | [diff] [blame] | 66 | &drawPreference, &tempInfo); |
Brian Salomon | 9bada54 | 2017-06-12 12:09:30 -0400 | [diff] [blame] | 67 | if (GrGpu::kNoDraw_DrawPreference == drawPreference) { |
Robert Phillips | 7294b85 | 2017-08-01 13:51:44 +0000 | [diff] [blame] | 68 | return this->fGpu->writePixels(surface, left, top, width, height, |
Robert Phillips | acaa607 | 2017-07-28 10:54:53 -0400 | [diff] [blame] | 69 | config, buffer, rowBytes); |
Brian Salomon | 9bada54 | 2017-06-12 12:09:30 -0400 | [diff] [blame] | 70 | } |
| 71 | GrSurfaceDesc desc; |
Robert Phillips | acaa607 | 2017-07-28 10:54:53 -0400 | [diff] [blame] | 72 | desc.fOrigin = proxy->origin(); |
Brian Salomon | 9bada54 | 2017-06-12 12:09:30 -0400 | [diff] [blame] | 73 | desc.fWidth = width; |
| 74 | desc.fHeight = height; |
Robert Phillips | acaa607 | 2017-07-28 10:54:53 -0400 | [diff] [blame] | 75 | desc.fConfig = proxy->config(); |
Brian Salomon | 9bada54 | 2017-06-12 12:09:30 -0400 | [diff] [blame] | 76 | sk_sp<GrTexture> temp(this->fResourceProvider->createApproxTexture( |
| 77 | desc, GrResourceProvider::kNoPendingIO_Flag)); |
| 78 | if (!temp) { |
| 79 | return false; |
| 80 | } |
Robert Phillips | 7294b85 | 2017-08-01 13:51:44 +0000 | [diff] [blame] | 81 | if (!fGpu->writePixels(temp.get(), 0, 0, width, height, desc.fConfig, |
Robert Phillips | acaa607 | 2017-07-28 10:54:53 -0400 | [diff] [blame] | 82 | buffer, rowBytes)) { |
Brian Salomon | 9bada54 | 2017-06-12 12:09:30 -0400 | [diff] [blame] | 83 | return false; |
| 84 | } |
Robert Phillips | 7294b85 | 2017-08-01 13:51:44 +0000 | [diff] [blame] | 85 | return fGpu->copySurface(surface, temp.get(), |
Robert Phillips | acaa607 | 2017-07-28 10:54:53 -0400 | [diff] [blame] | 86 | SkIRect::MakeWH(width, height), {left, top}); |
Brian Salomon | 9bada54 | 2017-06-12 12:09:30 -0400 | [diff] [blame] | 87 | }; |
| 88 | upload(wp); |
| 89 | } |