| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #ifndef GrResourceProvider_DEFINED | 8 #ifndef GrResourceProvider_DEFINED |
| 9 #define GrResourceProvider_DEFINED | 9 #define GrResourceProvider_DEFINED |
| 10 | 10 |
| 11 #include "GrBatchAtlas.h" | 11 #include "GrBatchAtlas.h" |
| 12 #include "GrIndexBuffer.h" | 12 #include "GrBuffer.h" |
| 13 #include "GrTextureProvider.h" | 13 #include "GrTextureProvider.h" |
| 14 #include "GrPathRange.h" | 14 #include "GrPathRange.h" |
| 15 | 15 |
| 16 class GrBatchAtlas; | 16 class GrBatchAtlas; |
| 17 class GrIndexBuffer; | |
| 18 class GrPath; | 17 class GrPath; |
| 19 class GrRenderTarget; | 18 class GrRenderTarget; |
| 20 class GrSingleOwner; | 19 class GrSingleOwner; |
| 21 class GrStencilAttachment; | 20 class GrStencilAttachment; |
| 22 class GrStrokeInfo; | 21 class GrStrokeInfo; |
| 23 class GrVertexBuffer; | |
| 24 class SkDescriptor; | 22 class SkDescriptor; |
| 25 class SkPath; | 23 class SkPath; |
| 26 class SkTypeface; | 24 class SkTypeface; |
| 27 | 25 |
| 28 /** | 26 /** |
| 29 * An extension of the texture provider for arbitrary resource types. This class
is intended for | 27 * An extension of the texture provider for arbitrary resource types. This class
is intended for |
| 30 * use within the Gr code base, not by clients or extensions (e.g. third party G
rProcessor | 28 * use within the Gr code base, not by clients or extensions (e.g. third party G
rProcessor |
| 31 * derivatives). | 29 * derivatives). |
| 32 * | 30 * |
| 33 * This currently inherits from GrTextureProvider non-publically to force caller
s to provider | 31 * This currently inherits from GrTextureProvider non-publically to force caller
s to provider |
| 34 * make a flags (pendingIO) decision and not use the GrTP methods that don't tak
e flags. This | 32 * make a flags (pendingIO) decision and not use the GrTP methods that don't tak
e flags. This |
| 35 * can be relaxed once https://bug.skia.org/4156 is fixed. | 33 * can be relaxed once https://bug.skia.org/4156 is fixed. |
| 36 */ | 34 */ |
| 37 class GrResourceProvider : protected GrTextureProvider { | 35 class GrResourceProvider : protected GrTextureProvider { |
| 38 public: | 36 public: |
| 39 GrResourceProvider(GrGpu* gpu, GrResourceCache* cache, GrSingleOwner* owner)
; | 37 GrResourceProvider(GrGpu* gpu, GrResourceCache* cache, GrSingleOwner* owner)
; |
| 40 | 38 |
| 41 template <typename T> T* findAndRefTByUniqueKey(const GrUniqueKey& key) { | 39 template <typename T> T* findAndRefTByUniqueKey(const GrUniqueKey& key) { |
| 42 return static_cast<T*>(this->findAndRefResourceByUniqueKey(key)); | 40 return static_cast<T*>(this->findAndRefResourceByUniqueKey(key)); |
| 43 } | 41 } |
| 44 | 42 |
| 45 /** | 43 /** |
| 46 * Either finds and refs, or creates an index buffer for instanced drawing w
ith a specific | 44 * Either finds and refs, or creates an index buffer for instanced drawing w
ith a specific |
| 47 * pattern if the index buffer is not found. If the return is non-null, the
caller owns | 45 * pattern if the index buffer is not found. If the return is non-null, the
caller owns |
| 48 * a ref on the returned GrIndexBuffer. | 46 * a ref on the returned GrBuffer. |
| 49 * | 47 * |
| 50 * @param pattern the pattern of indices to repeat | 48 * @param pattern the pattern of indices to repeat |
| 51 * @param patternSize size in bytes of the pattern | 49 * @param patternSize size in bytes of the pattern |
| 52 * @param reps number of times to repeat the pattern | 50 * @param reps number of times to repeat the pattern |
| 53 * @param vertCount number of vertices the pattern references | 51 * @param vertCount number of vertices the pattern references |
| 54 * @param key Key to be assigned to the index buffer. | 52 * @param key Key to be assigned to the index buffer. |
| 55 * | 53 * |
| 56 * @return The index buffer if successful, otherwise nullptr. | 54 * @return The index buffer if successful, otherwise nullptr. |
| 57 */ | 55 */ |
| 58 const GrIndexBuffer* findOrCreateInstancedIndexBuffer(const uint16_t* patter
n, | 56 const GrBuffer* findOrCreateInstancedIndexBuffer(const uint16_t* pattern, |
| 59 int patternSize, | 57 int patternSize, |
| 60 int reps, | 58 int reps, |
| 61 int vertCount, | 59 int vertCount, |
| 62 const GrUniqueKey& key
) { | 60 const GrUniqueKey& key) { |
| 63 if (GrIndexBuffer* buffer = this->findAndRefTByUniqueKey<GrIndexBuffer>(
key)) { | 61 if (GrBuffer* buffer = this->findAndRefTByUniqueKey<GrBuffer>(key)) { |
| 64 return buffer; | 62 return buffer; |
| 65 } | 63 } |
| 66 return this->createInstancedIndexBuffer(pattern, patternSize, reps, vert
Count, key); | 64 return this->createInstancedIndexBuffer(pattern, patternSize, reps, vert
Count, key); |
| 67 } | 65 } |
| 68 | 66 |
| 69 /** | 67 /** |
| 70 * Returns an index buffer that can be used to render quads. | 68 * Returns an index buffer that can be used to render quads. |
| 71 * Six indices per quad: 0, 1, 2, 0, 2, 3, etc. | 69 * Six indices per quad: 0, 1, 2, 0, 2, 3, etc. |
| 72 * The max number of quads can be queried using GrIndexBuffer::maxQuads(). | 70 * The max number of quads is the buffer's index capacity divided by 6. |
| 73 * Draw with kTriangles_GrPrimitiveType | 71 * Draw with kTriangles_GrPrimitiveType |
| 74 * @ return the quad index buffer | 72 * @ return the quad index buffer |
| 75 */ | 73 */ |
| 76 const GrIndexBuffer* refQuadIndexBuffer() { | 74 const GrBuffer* refQuadIndexBuffer() { |
| 77 if (GrIndexBuffer* buffer = | 75 if (GrBuffer* buffer = |
| 78 this->findAndRefTByUniqueKey<GrIndexBuffer>(fQuadIndexBufferKey)) { | 76 this->findAndRefTByUniqueKey<GrBuffer>(fQuadIndexBufferKey)) { |
| 79 return buffer; | 77 return buffer; |
| 80 } | 78 } |
| 81 return this->createQuadIndexBuffer(); | 79 return this->createQuadIndexBuffer(); |
| 82 } | 80 } |
| 83 | 81 |
| 84 /** | 82 /** |
| 85 * Factories for GrPath and GrPathRange objects. It's an error to call these
if path rendering | 83 * Factories for GrPath and GrPathRange objects. It's an error to call these
if path rendering |
| 86 * is not supported. | 84 * is not supported. |
| 87 */ | 85 */ |
| 88 GrPath* createPath(const SkPath&, const GrStrokeInfo&); | 86 GrPath* createPath(const SkPath&, const GrStrokeInfo&); |
| 89 GrPathRange* createPathRange(GrPathRange::PathGenerator*, const GrStrokeInfo
&); | 87 GrPathRange* createPathRange(GrPathRange::PathGenerator*, const GrStrokeInfo
&); |
| 90 GrPathRange* createGlyphs(const SkTypeface*, const SkDescriptor*, const GrSt
rokeInfo&); | 88 GrPathRange* createGlyphs(const SkTypeface*, const SkDescriptor*, const GrSt
rokeInfo&); |
| 91 | 89 |
| 92 using GrTextureProvider::assignUniqueKeyToResource; | 90 using GrTextureProvider::assignUniqueKeyToResource; |
| 93 using GrTextureProvider::findAndRefResourceByUniqueKey; | 91 using GrTextureProvider::findAndRefResourceByUniqueKey; |
| 94 using GrTextureProvider::findAndRefTextureByUniqueKey; | 92 using GrTextureProvider::findAndRefTextureByUniqueKey; |
| 95 using GrTextureProvider::abandon; | 93 using GrTextureProvider::abandon; |
| 96 | 94 |
| 97 enum Flags { | 95 enum Flags { |
| 98 /** If the caller intends to do direct reads/writes to/from the CPU then
this flag must be | 96 /** If the caller intends to do direct reads/writes to/from the CPU then
this flag must be |
| 99 * set when accessing resources during a GrDrawTarget flush. This inclu
des the execution of | 97 * set when accessing resources during a GrDrawTarget flush. This inclu
des the execution of |
| 100 * GrBatch objects. The reason is that these memory operations are done
immediately and | 98 * GrBatch objects. The reason is that these memory operations are done
immediately and |
| 101 * will occur out of order WRT the operations being flushed. | 99 * will occur out of order WRT the operations being flushed. |
| 102 * Make this automatic: https://bug.skia.org/4156 | 100 * Make this automatic: https://bug.skia.org/4156 |
| 103 */ | 101 */ |
| 104 kNoPendingIO_Flag = kNoPendingIO_ScratchTextureFlag, | 102 kNoPendingIO_Flag = kNoPendingIO_ScratchTextureFlag, |
| 105 }; | 103 }; |
| 106 | 104 |
| 107 enum BufferUsage { | 105 GrBuffer* createBuffer(GrBufferType, size_t size, GrAccessPattern, uint32_t
flags); |
| 108 /** Caller intends to specify the buffer data rarely with respect to the
number of draws | |
| 109 that read the data. */ | |
| 110 kStatic_BufferUsage, | |
| 111 /** Caller intends to respecify the buffer data frequently between draws
. */ | |
| 112 kDynamic_BufferUsage, | |
| 113 }; | |
| 114 GrIndexBuffer* createIndexBuffer(size_t size, BufferUsage, uint32_t flags); | |
| 115 GrVertexBuffer* createVertexBuffer(size_t size, BufferUsage, uint32_t flags)
; | |
| 116 GrTransferBuffer* createTransferBuffer(size_t size, TransferType, uint32_t f
lags); | |
| 117 | 106 |
| 118 GrTexture* createApproxTexture(const GrSurfaceDesc& desc, uint32_t flags) { | 107 GrTexture* createApproxTexture(const GrSurfaceDesc& desc, uint32_t flags) { |
| 119 SkASSERT(0 == flags || kNoPendingIO_Flag == flags); | 108 SkASSERT(0 == flags || kNoPendingIO_Flag == flags); |
| 120 return this->internalCreateApproxTexture(desc, flags); | 109 return this->internalCreateApproxTexture(desc, flags); |
| 121 } | 110 } |
| 122 | 111 |
| 123 /** Returns a GrBatchAtlas. This function can be called anywhere, but the r
eturned atlas should | 112 /** Returns a GrBatchAtlas. This function can be called anywhere, but the r
eturned atlas should |
| 124 * only be used inside of GrBatch::generateGeometry | 113 * only be used inside of GrBatch::generateGeometry |
| 125 * @param GrPixelConfig The pixel config which this atlas will store | 114 * @param GrPixelConfig The pixel config which this atlas will store |
| 126 * @param width width in pixels of the atlas | 115 * @param width width in pixels of the atlas |
| (...skipping 23 matching lines...) Expand all Loading... |
| 150 /** | 139 /** |
| 151 * Wraps an existing texture with a GrRenderTarget object. This is useful w
hen the provided | 140 * Wraps an existing texture with a GrRenderTarget object. This is useful w
hen the provided |
| 152 * texture has a format that cannot be textured from by Skia, but we want t
o raster to it. | 141 * texture has a format that cannot be textured from by Skia, but we want t
o raster to it. |
| 153 * | 142 * |
| 154 * @return GrRenderTarget object or NULL on failure. | 143 * @return GrRenderTarget object or NULL on failure. |
| 155 */ | 144 */ |
| 156 GrRenderTarget* wrapBackendTextureAsRenderTarget(const GrBackendTextureDesc
& desc, | 145 GrRenderTarget* wrapBackendTextureAsRenderTarget(const GrBackendTextureDesc
& desc, |
| 157 GrWrapOwnership = kBorrow_
GrWrapOwnership); | 146 GrWrapOwnership = kBorrow_
GrWrapOwnership); |
| 158 | 147 |
| 159 private: | 148 private: |
| 160 const GrIndexBuffer* createInstancedIndexBuffer(const uint16_t* pattern, | 149 const GrBuffer* createInstancedIndexBuffer(const uint16_t* pattern, |
| 161 int patternSize, | 150 int patternSize, |
| 162 int reps, | 151 int reps, |
| 163 int vertCount, | 152 int vertCount, |
| 164 const GrUniqueKey& key); | 153 const GrUniqueKey& key); |
| 165 | 154 |
| 166 const GrIndexBuffer* createQuadIndexBuffer(); | 155 const GrBuffer* createQuadIndexBuffer(); |
| 167 | 156 |
| 168 GrUniqueKey fQuadIndexBufferKey; | 157 GrUniqueKey fQuadIndexBufferKey; |
| 169 | 158 |
| 170 typedef GrTextureProvider INHERITED; | 159 typedef GrTextureProvider INHERITED; |
| 171 }; | 160 }; |
| 172 | 161 |
| 173 #endif | 162 #endif |
| OLD | NEW |