OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2010 Google Inc. | 2 * Copyright 2010 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 | 8 |
9 #include "GrGpu.h" | 9 #include "GrGpu.h" |
10 | 10 |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
92 | 92 |
93 /** | 93 /** |
94 * Prior to creating a texture, make sure the type of texture being created is | 94 * Prior to creating a texture, make sure the type of texture being created is |
95 * supported by calling check_texture_creation_params. | 95 * supported by calling check_texture_creation_params. |
96 * | 96 * |
97 * @param caps The capabilities of the GL device. | 97 * @param caps The capabilities of the GL device. |
98 * @param desc The descriptor of the texture to create. | 98 * @param desc The descriptor of the texture to create. |
99 * @param isRT Indicates if the texture can be a render target. | 99 * @param isRT Indicates if the texture can be a render target. |
100 */ | 100 */ |
101 static bool check_texture_creation_params(const GrCaps& caps, const GrSurfaceDes
c& desc, | 101 static bool check_texture_creation_params(const GrCaps& caps, const GrSurfaceDes
c& desc, |
102 bool* isRT) { | 102 bool* isRT, const SkTArray<GrMipLevel>
& texels) { |
103 if (!caps.isConfigTexturable(desc.fConfig)) { | 103 if (!caps.isConfigTexturable(desc.fConfig)) { |
104 return false; | 104 return false; |
105 } | 105 } |
106 | 106 |
107 *isRT = SkToBool(desc.fFlags & kRenderTarget_GrSurfaceFlag); | 107 *isRT = SkToBool(desc.fFlags & kRenderTarget_GrSurfaceFlag); |
108 if (*isRT && !caps.isConfigRenderable(desc.fConfig, desc.fSampleCnt > 0)) { | 108 if (*isRT && !caps.isConfigRenderable(desc.fConfig, desc.fSampleCnt > 0)) { |
109 return false; | 109 return false; |
110 } | 110 } |
111 | 111 |
112 // We currently do not support multisampled textures | 112 // We currently do not support multisampled textures |
113 if (!*isRT && desc.fSampleCnt > 0) { | 113 if (!*isRT && desc.fSampleCnt > 0) { |
114 return false; | 114 return false; |
115 } | 115 } |
116 | 116 |
117 if (*isRT) { | 117 if (*isRT) { |
118 int maxRTSize = caps.maxRenderTargetSize(); | 118 int maxRTSize = caps.maxRenderTargetSize(); |
119 if (desc.fWidth > maxRTSize || desc.fHeight > maxRTSize) { | 119 if (desc.fWidth > maxRTSize || desc.fHeight > maxRTSize) { |
120 return false; | 120 return false; |
121 } | 121 } |
122 } else { | 122 } else { |
123 int maxSize = caps.maxTextureSize(); | 123 int maxSize = caps.maxTextureSize(); |
124 if (desc.fWidth > maxSize || desc.fHeight > maxSize) { | 124 if (desc.fWidth > maxSize || desc.fHeight > maxSize) { |
125 return false; | 125 return false; |
126 } | 126 } |
127 } | 127 } |
| 128 |
| 129 for (int i = 0; i < texels.count(); ++i) { |
| 130 if (!texels[i].fPixels) { |
| 131 return false; |
| 132 } |
| 133 } |
128 return true; | 134 return true; |
129 } | 135 } |
130 | 136 |
131 GrTexture* GrGpu::createTexture(const GrSurfaceDesc& origDesc, SkBudgeted budget
ed, | 137 GrTexture* GrGpu::createTexture(const GrSurfaceDesc& origDesc, SkBudgeted budget
ed, |
132 const SkTArray<GrMipLevel>& texels) { | 138 const SkTArray<GrMipLevel>& texels) { |
133 GrSurfaceDesc desc = origDesc; | 139 GrSurfaceDesc desc = origDesc; |
134 | 140 |
135 const GrCaps* caps = this->caps(); | 141 const GrCaps* caps = this->caps(); |
136 bool isRT = false; | 142 bool isRT = false; |
137 bool textureCreationParamsValid = check_texture_creation_params(*caps, desc,
&isRT); | 143 bool textureCreationParamsValid = check_texture_creation_params(*caps, desc,
&isRT, texels); |
138 if (!textureCreationParamsValid) { | 144 if (!textureCreationParamsValid) { |
139 return nullptr; | 145 return nullptr; |
140 } | 146 } |
141 | 147 |
142 desc.fSampleCnt = SkTMin(desc.fSampleCnt, caps->maxSampleCount()); | 148 desc.fSampleCnt = SkTMin(desc.fSampleCnt, caps->maxSampleCount()); |
143 // Attempt to catch un- or wrongly intialized sample counts; | 149 // Attempt to catch un- or wrongly intialized sample counts; |
144 SkASSERT(desc.fSampleCnt >= 0 && desc.fSampleCnt <= 64); | 150 SkASSERT(desc.fSampleCnt >= 0 && desc.fSampleCnt <= 64); |
145 | 151 |
146 desc.fOrigin = resolve_origin(desc.fOrigin, isRT); | 152 desc.fOrigin = resolve_origin(desc.fOrigin, isRT); |
147 | 153 |
(...skipping 25 matching lines...) Expand all Loading... |
173 fStats.incTextureCreates(); | 179 fStats.incTextureCreates(); |
174 if (!texels.empty()) { | 180 if (!texels.empty()) { |
175 if (texels[0].fPixels) { | 181 if (texels[0].fPixels) { |
176 fStats.incTextureUploads(); | 182 fStats.incTextureUploads(); |
177 } | 183 } |
178 } | 184 } |
179 } | 185 } |
180 return tex; | 186 return tex; |
181 } | 187 } |
182 | 188 |
183 GrTexture* GrGpu::createTexture(const GrSurfaceDesc& desc, SkBudgeted budgeted, | |
184 const void* srcData, size_t rowBytes) { | |
185 GrMipLevel level; | |
186 level.fPixels = srcData; | |
187 level.fRowBytes = rowBytes; | |
188 SkSTArray<1, GrMipLevel> levels; | |
189 levels.push_back(level); | |
190 | |
191 return this->createTexture(desc, budgeted, levels); | |
192 } | |
193 | |
194 GrTexture* GrGpu::wrapBackendTexture(const GrBackendTextureDesc& desc, GrWrapOwn
ership ownership) { | 189 GrTexture* GrGpu::wrapBackendTexture(const GrBackendTextureDesc& desc, GrWrapOwn
ership ownership) { |
195 this->handleDirtyContext(); | 190 this->handleDirtyContext(); |
196 if (!this->caps()->isConfigTexturable(desc.fConfig)) { | 191 if (!this->caps()->isConfigTexturable(desc.fConfig)) { |
197 return nullptr; | 192 return nullptr; |
198 } | 193 } |
199 if ((desc.fFlags & kRenderTarget_GrBackendTextureFlag) && | 194 if ((desc.fFlags & kRenderTarget_GrBackendTextureFlag) && |
200 !this->caps()->isConfigRenderable(desc.fConfig, desc.fSampleCnt > 0)) { | 195 !this->caps()->isConfigRenderable(desc.fConfig, desc.fSampleCnt > 0)) { |
201 return nullptr; | 196 return nullptr; |
202 } | 197 } |
203 int maxSize = this->caps()->maxTextureSize(); | 198 int maxSize = this->caps()->maxTextureSize(); |
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
385 config, buffer, | 380 config, buffer, |
386 rowBytes); | 381 rowBytes); |
387 } | 382 } |
388 | 383 |
389 bool GrGpu::writePixels(GrSurface* surface, | 384 bool GrGpu::writePixels(GrSurface* surface, |
390 int left, int top, int width, int height, | 385 int left, int top, int width, int height, |
391 GrPixelConfig config, const SkTArray<GrMipLevel>& texels
) { | 386 GrPixelConfig config, const SkTArray<GrMipLevel>& texels
) { |
392 if (!surface) { | 387 if (!surface) { |
393 return false; | 388 return false; |
394 } | 389 } |
395 bool validMipDataFound = false; | |
396 for (int currentMipLevel = 0; currentMipLevel < texels.count(); currentMipLe
vel++) { | 390 for (int currentMipLevel = 0; currentMipLevel < texels.count(); currentMipLe
vel++) { |
397 if (texels[currentMipLevel].fPixels != nullptr) { | 391 if (!texels[currentMipLevel].fPixels ) { |
398 validMipDataFound = true; | 392 return false; |
399 break; | |
400 } | 393 } |
401 } | 394 } |
402 if (!validMipDataFound) { | |
403 return false; | |
404 } | |
405 | 395 |
406 this->handleDirtyContext(); | 396 this->handleDirtyContext(); |
407 if (this->onWritePixels(surface, left, top, width, height, config, texels))
{ | 397 if (this->onWritePixels(surface, left, top, width, height, config, texels))
{ |
408 fStats.incTextureUploads(); | 398 fStats.incTextureUploads(); |
409 return true; | 399 return true; |
410 } | 400 } |
411 return false; | 401 return false; |
412 } | 402 } |
413 | 403 |
414 bool GrGpu::writePixels(GrSurface* surface, | 404 bool GrGpu::writePixels(GrSurface* surface, |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
509 } | 499 } |
510 | 500 |
511 GrVertices::Iterator iter; | 501 GrVertices::Iterator iter; |
512 const GrNonInstancedVertices* verts = iter.init(vertices); | 502 const GrNonInstancedVertices* verts = iter.init(vertices); |
513 do { | 503 do { |
514 this->onDraw(args, *verts); | 504 this->onDraw(args, *verts); |
515 fStats.incNumDraws(); | 505 fStats.incNumDraws(); |
516 } while ((verts = iter.next())); | 506 } while ((verts = iter.next())); |
517 } | 507 } |
518 | 508 |
OLD | NEW |