OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 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 "GrGpuGL.h" | 9 #include "GrGpuGL.h" |
10 #include "GrGLStencilBuffer.h" | 10 #include "GrGLStencilBuffer.h" |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
53 GR_GL_CONSTANT_ALPHA, | 53 GR_GL_CONSTANT_ALPHA, |
54 GR_GL_ONE_MINUS_CONSTANT_ALPHA, | 54 GR_GL_ONE_MINUS_CONSTANT_ALPHA, |
55 | 55 |
56 // extended blend coeffs | 56 // extended blend coeffs |
57 GR_GL_SRC1_COLOR, | 57 GR_GL_SRC1_COLOR, |
58 GR_GL_ONE_MINUS_SRC1_COLOR, | 58 GR_GL_ONE_MINUS_SRC1_COLOR, |
59 GR_GL_SRC1_ALPHA, | 59 GR_GL_SRC1_ALPHA, |
60 GR_GL_ONE_MINUS_SRC1_ALPHA, | 60 GR_GL_ONE_MINUS_SRC1_ALPHA, |
61 }; | 61 }; |
62 | 62 |
63 bool GrGpuGL::BlendCoeffReferencesConstant(GrBlendCoeff coeff) { | 63 bool GrGLGpu::BlendCoeffReferencesConstant(GrBlendCoeff coeff) { |
64 static const bool gCoeffReferencesBlendConst[] = { | 64 static const bool gCoeffReferencesBlendConst[] = { |
65 false, | 65 false, |
66 false, | 66 false, |
67 false, | 67 false, |
68 false, | 68 false, |
69 false, | 69 false, |
70 false, | 70 false, |
71 false, | 71 false, |
72 false, | 72 false, |
73 false, | 73 false, |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
109 | 109 |
110 // assertion for gXfermodeCoeff2Blend have to be in GrGpu scope | 110 // assertion for gXfermodeCoeff2Blend have to be in GrGpu scope |
111 GR_STATIC_ASSERT(kTotalGrBlendCoeffCount == | 111 GR_STATIC_ASSERT(kTotalGrBlendCoeffCount == |
112 SK_ARRAY_COUNT(gXfermodeCoeff2Blend)); | 112 SK_ARRAY_COUNT(gXfermodeCoeff2Blend)); |
113 } | 113 } |
114 | 114 |
115 /////////////////////////////////////////////////////////////////////////////// | 115 /////////////////////////////////////////////////////////////////////////////// |
116 | 116 |
117 static bool gPrintStartupSpew; | 117 static bool gPrintStartupSpew; |
118 | 118 |
119 GrGpuGL::GrGpuGL(const GrGLContext& ctx, GrContext* context) | 119 GrGLGpu::GrGLGpu(const GrGLContext& ctx, GrContext* context) |
120 : GrGpu(context) | 120 : GrGpu(context) |
121 , fGLContext(ctx) { | 121 , fGLContext(ctx) { |
122 | 122 |
123 SkASSERT(ctx.isInitialized()); | 123 SkASSERT(ctx.isInitialized()); |
124 fCaps.reset(SkRef(ctx.caps())); | 124 fCaps.reset(SkRef(ctx.caps())); |
125 | 125 |
126 fHWBoundTextureUniqueIDs.reset(this->glCaps().maxFragmentTextureUnits()); | 126 fHWBoundTextureUniqueIDs.reset(this->glCaps().maxFragmentTextureUnits()); |
127 | 127 |
128 GrGLClearErr(fGLContext.interface()); | 128 GrGLClearErr(fGLContext.interface()); |
129 if (gPrintStartupSpew) { | 129 if (gPrintStartupSpew) { |
130 const GrGLubyte* vendor; | 130 const GrGLubyte* vendor; |
131 const GrGLubyte* renderer; | 131 const GrGLubyte* renderer; |
132 const GrGLubyte* version; | 132 const GrGLubyte* version; |
133 GL_CALL_RET(vendor, GetString(GR_GL_VENDOR)); | 133 GL_CALL_RET(vendor, GetString(GR_GL_VENDOR)); |
134 GL_CALL_RET(renderer, GetString(GR_GL_RENDERER)); | 134 GL_CALL_RET(renderer, GetString(GR_GL_RENDERER)); |
135 GL_CALL_RET(version, GetString(GR_GL_VERSION)); | 135 GL_CALL_RET(version, GetString(GR_GL_VERSION)); |
136 SkDebugf("------------------------- create GrGpuGL %p --------------\n", | 136 SkDebugf("------------------------- create GrGLGpu %p --------------\n", |
137 this); | 137 this); |
138 SkDebugf("------ VENDOR %s\n", vendor); | 138 SkDebugf("------ VENDOR %s\n", vendor); |
139 SkDebugf("------ RENDERER %s\n", renderer); | 139 SkDebugf("------ RENDERER %s\n", renderer); |
140 SkDebugf("------ VERSION %s\n", version); | 140 SkDebugf("------ VERSION %s\n", version); |
141 SkDebugf("------ EXTENSIONS\n"); | 141 SkDebugf("------ EXTENSIONS\n"); |
142 ctx.extensions().print(); | 142 ctx.extensions().print(); |
143 SkDebugf("\n"); | 143 SkDebugf("\n"); |
144 SkDebugf(this->glCaps().dump().c_str()); | 144 SkDebugf(this->glCaps().dump().c_str()); |
145 } | 145 } |
146 | 146 |
147 fProgramCache = SkNEW_ARGS(ProgramCache, (this)); | 147 fProgramCache = SkNEW_ARGS(ProgramCache, (this)); |
148 | 148 |
149 SkASSERT(this->glCaps().maxVertexAttributes() >= GrGeometryProcessor::kMaxVe
rtexAttribs); | 149 SkASSERT(this->glCaps().maxVertexAttributes() >= GrGeometryProcessor::kMaxVe
rtexAttribs); |
150 | 150 |
151 fLastSuccessfulStencilFmtIdx = 0; | 151 fLastSuccessfulStencilFmtIdx = 0; |
152 fHWProgramID = 0; | 152 fHWProgramID = 0; |
153 | 153 |
154 if (this->glCaps().pathRenderingSupport()) { | 154 if (this->glCaps().pathRenderingSupport()) { |
155 fPathRendering.reset(new GrGLPathRendering(this)); | 155 fPathRendering.reset(new GrGLPathRendering(this)); |
156 } | 156 } |
157 } | 157 } |
158 | 158 |
159 GrGpuGL::~GrGpuGL() { | 159 GrGLGpu::~GrGLGpu() { |
160 if (0 != fHWProgramID) { | 160 if (0 != fHWProgramID) { |
161 // detach the current program so there is no confusion on OpenGL's part | 161 // detach the current program so there is no confusion on OpenGL's part |
162 // that we want it to be deleted | 162 // that we want it to be deleted |
163 SkASSERT(fHWProgramID == fCurrentProgram->programID()); | 163 SkASSERT(fHWProgramID == fCurrentProgram->programID()); |
164 GL_CALL(UseProgram(0)); | 164 GL_CALL(UseProgram(0)); |
165 } | 165 } |
166 | 166 |
167 delete fProgramCache; | 167 delete fProgramCache; |
168 } | 168 } |
169 | 169 |
170 void GrGpuGL::contextAbandoned() { | 170 void GrGLGpu::contextAbandoned() { |
171 INHERITED::contextAbandoned(); | 171 INHERITED::contextAbandoned(); |
172 fProgramCache->abandon(); | 172 fProgramCache->abandon(); |
173 fHWProgramID = 0; | 173 fHWProgramID = 0; |
174 if (this->glCaps().pathRenderingSupport()) { | 174 if (this->glCaps().pathRenderingSupport()) { |
175 this->glPathRendering()->abandonGpuResources(); | 175 this->glPathRendering()->abandonGpuResources(); |
176 } | 176 } |
177 } | 177 } |
178 | 178 |
179 /////////////////////////////////////////////////////////////////////////////// | 179 /////////////////////////////////////////////////////////////////////////////// |
180 GrPixelConfig GrGpuGL::preferredReadPixelsConfig(GrPixelConfig readConfig, | 180 GrPixelConfig GrGLGpu::preferredReadPixelsConfig(GrPixelConfig readConfig, |
181 GrPixelConfig surfaceConfig) co
nst { | 181 GrPixelConfig surfaceConfig) co
nst { |
182 if (GR_GL_RGBA_8888_PIXEL_OPS_SLOW && kRGBA_8888_GrPixelConfig == readConfig
) { | 182 if (GR_GL_RGBA_8888_PIXEL_OPS_SLOW && kRGBA_8888_GrPixelConfig == readConfig
) { |
183 return kBGRA_8888_GrPixelConfig; | 183 return kBGRA_8888_GrPixelConfig; |
184 } else if (this->glContext().isMesa() && | 184 } else if (this->glContext().isMesa() && |
185 GrBytesPerPixel(readConfig) == 4 && | 185 GrBytesPerPixel(readConfig) == 4 && |
186 GrPixelConfigSwapRAndB(readConfig) == surfaceConfig) { | 186 GrPixelConfigSwapRAndB(readConfig) == surfaceConfig) { |
187 // Mesa 3D takes a slow path on when reading back BGRA from an RGBA sur
face and vice-versa. | 187 // Mesa 3D takes a slow path on when reading back BGRA from an RGBA sur
face and vice-versa. |
188 // Perhaps this should be guarded by some compiletime or runtime check. | 188 // Perhaps this should be guarded by some compiletime or runtime check. |
189 return surfaceConfig; | 189 return surfaceConfig; |
190 } else if (readConfig == kBGRA_8888_GrPixelConfig | 190 } else if (readConfig == kBGRA_8888_GrPixelConfig |
191 && !this->glCaps().readPixelsSupported( | 191 && !this->glCaps().readPixelsSupported( |
192 this->glInterface(), | 192 this->glInterface(), |
193 GR_GL_BGRA, | 193 GR_GL_BGRA, |
194 GR_GL_UNSIGNED_BYTE, | 194 GR_GL_UNSIGNED_BYTE, |
195 surfaceConfig | 195 surfaceConfig |
196 )) { | 196 )) { |
197 return kRGBA_8888_GrPixelConfig; | 197 return kRGBA_8888_GrPixelConfig; |
198 } else { | 198 } else { |
199 return readConfig; | 199 return readConfig; |
200 } | 200 } |
201 } | 201 } |
202 | 202 |
203 GrPixelConfig GrGpuGL::preferredWritePixelsConfig(GrPixelConfig writeConfig, | 203 GrPixelConfig GrGLGpu::preferredWritePixelsConfig(GrPixelConfig writeConfig, |
204 GrPixelConfig surfaceConfig) c
onst { | 204 GrPixelConfig surfaceConfig) c
onst { |
205 if (GR_GL_RGBA_8888_PIXEL_OPS_SLOW && kRGBA_8888_GrPixelConfig == writeConfi
g) { | 205 if (GR_GL_RGBA_8888_PIXEL_OPS_SLOW && kRGBA_8888_GrPixelConfig == writeConfi
g) { |
206 return kBGRA_8888_GrPixelConfig; | 206 return kBGRA_8888_GrPixelConfig; |
207 } else { | 207 } else { |
208 return writeConfig; | 208 return writeConfig; |
209 } | 209 } |
210 } | 210 } |
211 | 211 |
212 bool GrGpuGL::canWriteTexturePixels(const GrTexture* texture, GrPixelConfig srcC
onfig) const { | 212 bool GrGLGpu::canWriteTexturePixels(const GrTexture* texture, GrPixelConfig srcC
onfig) const { |
213 if (kIndex_8_GrPixelConfig == srcConfig || kIndex_8_GrPixelConfig == texture
->config()) { | 213 if (kIndex_8_GrPixelConfig == srcConfig || kIndex_8_GrPixelConfig == texture
->config()) { |
214 return false; | 214 return false; |
215 } | 215 } |
216 if (srcConfig != texture->config() && kGLES_GrGLStandard == this->glStandard
()) { | 216 if (srcConfig != texture->config() && kGLES_GrGLStandard == this->glStandard
()) { |
217 // In general ES2 requires the internal format of the texture and the fo
rmat of the src | 217 // In general ES2 requires the internal format of the texture and the fo
rmat of the src |
218 // pixels to match. However, It may or may not be possible to upload BGR
A data to a RGBA | 218 // pixels to match. However, It may or may not be possible to upload BGR
A data to a RGBA |
219 // texture. It depends upon which extension added BGRA. The Apple extens
ion allows it | 219 // texture. It depends upon which extension added BGRA. The Apple extens
ion allows it |
220 // (BGRA's internal format is RGBA) while the EXT extension does not (BG
RA is its own | 220 // (BGRA's internal format is RGBA) while the EXT extension does not (BG
RA is its own |
221 // internal format). | 221 // internal format). |
222 if (this->glCaps().isConfigTexturable(kBGRA_8888_GrPixelConfig) && | 222 if (this->glCaps().isConfigTexturable(kBGRA_8888_GrPixelConfig) && |
223 !this->glCaps().bgraIsInternalFormat() && | 223 !this->glCaps().bgraIsInternalFormat() && |
224 kBGRA_8888_GrPixelConfig == srcConfig && | 224 kBGRA_8888_GrPixelConfig == srcConfig && |
225 kRGBA_8888_GrPixelConfig == texture->config()) { | 225 kRGBA_8888_GrPixelConfig == texture->config()) { |
226 return true; | 226 return true; |
227 } else { | 227 } else { |
228 return false; | 228 return false; |
229 } | 229 } |
230 } else { | 230 } else { |
231 return true; | 231 return true; |
232 } | 232 } |
233 } | 233 } |
234 | 234 |
235 bool GrGpuGL::fullReadPixelsIsFasterThanPartial() const { | 235 bool GrGLGpu::fullReadPixelsIsFasterThanPartial() const { |
236 return SkToBool(GR_GL_FULL_READPIXELS_FASTER_THAN_PARTIAL); | 236 return SkToBool(GR_GL_FULL_READPIXELS_FASTER_THAN_PARTIAL); |
237 } | 237 } |
238 | 238 |
239 void GrGpuGL::onResetContext(uint32_t resetBits) { | 239 void GrGLGpu::onResetContext(uint32_t resetBits) { |
240 // we don't use the zb at all | 240 // we don't use the zb at all |
241 if (resetBits & kMisc_GrGLBackendState) { | 241 if (resetBits & kMisc_GrGLBackendState) { |
242 GL_CALL(Disable(GR_GL_DEPTH_TEST)); | 242 GL_CALL(Disable(GR_GL_DEPTH_TEST)); |
243 GL_CALL(DepthMask(GR_GL_FALSE)); | 243 GL_CALL(DepthMask(GR_GL_FALSE)); |
244 | 244 |
245 fHWDrawFace = GrDrawState::kInvalid_DrawFace; | 245 fHWDrawFace = GrDrawState::kInvalid_DrawFace; |
246 fHWDitherEnabled = kUnknown_TriState; | 246 fHWDitherEnabled = kUnknown_TriState; |
247 | 247 |
248 if (kGL_GrGLStandard == this->glStandard()) { | 248 if (kGL_GrGLStandard == this->glStandard()) { |
249 // Desktop-only state that we never change | 249 // Desktop-only state that we never change |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
352 // to render upside down. | 352 // to render upside down. |
353 if (kDefault_GrSurfaceOrigin == origin) { | 353 if (kDefault_GrSurfaceOrigin == origin) { |
354 return renderTarget ? kBottomLeft_GrSurfaceOrigin : kTopLeft_GrSurfaceOr
igin; | 354 return renderTarget ? kBottomLeft_GrSurfaceOrigin : kTopLeft_GrSurfaceOr
igin; |
355 } else { | 355 } else { |
356 return origin; | 356 return origin; |
357 } | 357 } |
358 } | 358 } |
359 | 359 |
360 } | 360 } |
361 | 361 |
362 GrTexture* GrGpuGL::onWrapBackendTexture(const GrBackendTextureDesc& desc) { | 362 GrTexture* GrGLGpu::onWrapBackendTexture(const GrBackendTextureDesc& desc) { |
363 if (!this->configToGLFormats(desc.fConfig, false, NULL, NULL, NULL)) { | 363 if (!this->configToGLFormats(desc.fConfig, false, NULL, NULL, NULL)) { |
364 return NULL; | 364 return NULL; |
365 } | 365 } |
366 | 366 |
367 if (0 == desc.fTextureHandle) { | 367 if (0 == desc.fTextureHandle) { |
368 return NULL; | 368 return NULL; |
369 } | 369 } |
370 | 370 |
371 int maxSize = this->caps()->maxTextureSize(); | 371 int maxSize = this->caps()->maxTextureSize(); |
372 if (desc.fWidth > maxSize || desc.fHeight > maxSize) { | 372 if (desc.fWidth > maxSize || desc.fHeight > maxSize) { |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
406 } else { | 406 } else { |
407 texture = SkNEW_ARGS(GrGLTexture, (this, surfDesc, idDesc)); | 407 texture = SkNEW_ARGS(GrGLTexture, (this, surfDesc, idDesc)); |
408 } | 408 } |
409 if (NULL == texture) { | 409 if (NULL == texture) { |
410 return NULL; | 410 return NULL; |
411 } | 411 } |
412 | 412 |
413 return texture; | 413 return texture; |
414 } | 414 } |
415 | 415 |
416 GrRenderTarget* GrGpuGL::onWrapBackendRenderTarget(const GrBackendRenderTargetDe
sc& wrapDesc) { | 416 GrRenderTarget* GrGLGpu::onWrapBackendRenderTarget(const GrBackendRenderTargetDe
sc& wrapDesc) { |
417 GrGLRenderTarget::IDDesc idDesc; | 417 GrGLRenderTarget::IDDesc idDesc; |
418 idDesc.fRTFBOID = static_cast<GrGLuint>(wrapDesc.fRenderTargetHandle); | 418 idDesc.fRTFBOID = static_cast<GrGLuint>(wrapDesc.fRenderTargetHandle); |
419 idDesc.fMSColorRenderbufferID = 0; | 419 idDesc.fMSColorRenderbufferID = 0; |
420 idDesc.fTexFBOID = GrGLRenderTarget::kUnresolvableFBOID; | 420 idDesc.fTexFBOID = GrGLRenderTarget::kUnresolvableFBOID; |
421 | 421 |
422 GrSurfaceDesc desc; | 422 GrSurfaceDesc desc; |
423 desc.fConfig = wrapDesc.fConfig; | 423 desc.fConfig = wrapDesc.fConfig; |
424 desc.fFlags = kCheckAllocation_GrSurfaceFlag; | 424 desc.fFlags = kCheckAllocation_GrSurfaceFlag; |
425 desc.fWidth = wrapDesc.fWidth; | 425 desc.fWidth = wrapDesc.fWidth; |
426 desc.fHeight = wrapDesc.fHeight; | 426 desc.fHeight = wrapDesc.fHeight; |
(...skipping 17 matching lines...) Expand all Loading... |
444 desc.fSampleCnt, | 444 desc.fSampleCnt, |
445 format)); | 445 format)); |
446 tgt->setStencilBuffer(sb); | 446 tgt->setStencilBuffer(sb); |
447 sb->unref(); | 447 sb->unref(); |
448 } | 448 } |
449 return tgt; | 449 return tgt; |
450 } | 450 } |
451 | 451 |
452 //////////////////////////////////////////////////////////////////////////////// | 452 //////////////////////////////////////////////////////////////////////////////// |
453 | 453 |
454 bool GrGpuGL::onWriteTexturePixels(GrTexture* texture, | 454 bool GrGLGpu::onWriteTexturePixels(GrTexture* texture, |
455 int left, int top, int width, int height, | 455 int left, int top, int width, int height, |
456 GrPixelConfig config, const void* buffer, | 456 GrPixelConfig config, const void* buffer, |
457 size_t rowBytes) { | 457 size_t rowBytes) { |
458 if (NULL == buffer) { | 458 if (NULL == buffer) { |
459 return false; | 459 return false; |
460 } | 460 } |
461 GrGLTexture* glTex = static_cast<GrGLTexture*>(texture); | 461 GrGLTexture* glTex = static_cast<GrGLTexture*>(texture); |
462 | 462 |
463 this->setScratchTextureUnit(); | 463 this->setScratchTextureUnit(); |
464 GL_CALL(BindTexture(GR_GL_TEXTURE_2D, glTex->textureID())); | 464 GL_CALL(BindTexture(GR_GL_TEXTURE_2D, glTex->textureID())); |
465 | 465 |
466 bool success = false; | 466 bool success = false; |
467 if (GrPixelConfigIsCompressed(glTex->desc().fConfig)) { | 467 if (GrPixelConfigIsCompressed(glTex->desc().fConfig)) { |
468 // We check that config == desc.fConfig in GrGpuGL::canWriteTexturePixel
s() | 468 // We check that config == desc.fConfig in GrGLGpu::canWriteTexturePixel
s() |
469 SkASSERT(config == glTex->desc().fConfig); | 469 SkASSERT(config == glTex->desc().fConfig); |
470 success = this->uploadCompressedTexData(glTex->desc(), buffer, false, le
ft, top, width, | 470 success = this->uploadCompressedTexData(glTex->desc(), buffer, false, le
ft, top, width, |
471 height); | 471 height); |
472 } else { | 472 } else { |
473 success = this->uploadTexData(glTex->desc(), false, left, top, width, he
ight, config, | 473 success = this->uploadTexData(glTex->desc(), false, left, top, width, he
ight, config, |
474 buffer, rowBytes); | 474 buffer, rowBytes); |
475 } | 475 } |
476 | 476 |
477 if (success) { | 477 if (success) { |
478 texture->texturePriv().dirtyMipMaps(true); | 478 texture->texturePriv().dirtyMipMaps(true); |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
510 | 510 |
511 static inline GrGLenum check_alloc_error(const GrSurfaceDesc& desc, | 511 static inline GrGLenum check_alloc_error(const GrSurfaceDesc& desc, |
512 const GrGLInterface* interface) { | 512 const GrGLInterface* interface) { |
513 if (SkToBool(desc.fFlags & kCheckAllocation_GrSurfaceFlag)) { | 513 if (SkToBool(desc.fFlags & kCheckAllocation_GrSurfaceFlag)) { |
514 return GR_GL_GET_ERROR(interface); | 514 return GR_GL_GET_ERROR(interface); |
515 } else { | 515 } else { |
516 return CHECK_ALLOC_ERROR(interface); | 516 return CHECK_ALLOC_ERROR(interface); |
517 } | 517 } |
518 } | 518 } |
519 | 519 |
520 bool GrGpuGL::uploadTexData(const GrSurfaceDesc& desc, | 520 bool GrGLGpu::uploadTexData(const GrSurfaceDesc& desc, |
521 bool isNewTexture, | 521 bool isNewTexture, |
522 int left, int top, int width, int height, | 522 int left, int top, int width, int height, |
523 GrPixelConfig dataConfig, | 523 GrPixelConfig dataConfig, |
524 const void* data, | 524 const void* data, |
525 size_t rowBytes) { | 525 size_t rowBytes) { |
526 SkASSERT(data || isNewTexture); | 526 SkASSERT(data || isNewTexture); |
527 | 527 |
528 // If we're uploading compressed data then we should be using uploadCompress
edTexData | 528 // If we're uploading compressed data then we should be using uploadCompress
edTexData |
529 SkASSERT(!GrPixelConfigIsCompressed(dataConfig)); | 529 SkASSERT(!GrPixelConfigIsCompressed(dataConfig)); |
530 | 530 |
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
682 GL_CALL(PixelStorei(GR_GL_UNPACK_FLIP_Y, GR_GL_FALSE)); | 682 GL_CALL(PixelStorei(GR_GL_UNPACK_FLIP_Y, GR_GL_FALSE)); |
683 } | 683 } |
684 return succeeded; | 684 return succeeded; |
685 } | 685 } |
686 | 686 |
687 // TODO: This function is using a lot of wonky semantics like, if width == -1 | 687 // TODO: This function is using a lot of wonky semantics like, if width == -1 |
688 // then set width = desc.fWdith ... blah. A better way to do it might be to | 688 // then set width = desc.fWdith ... blah. A better way to do it might be to |
689 // create a CompressedTexData struct that takes a desc/ptr and figures out | 689 // create a CompressedTexData struct that takes a desc/ptr and figures out |
690 // the proper upload semantics. Then users can construct this function how they | 690 // the proper upload semantics. Then users can construct this function how they |
691 // see fit if they want to go against the "standard" way to do it. | 691 // see fit if they want to go against the "standard" way to do it. |
692 bool GrGpuGL::uploadCompressedTexData(const GrSurfaceDesc& desc, | 692 bool GrGLGpu::uploadCompressedTexData(const GrSurfaceDesc& desc, |
693 const void* data, | 693 const void* data, |
694 bool isNewTexture, | 694 bool isNewTexture, |
695 int left, int top, int width, int height)
{ | 695 int left, int top, int width, int height)
{ |
696 SkASSERT(data || isNewTexture); | 696 SkASSERT(data || isNewTexture); |
697 | 697 |
698 // No support for software flip y, yet... | 698 // No support for software flip y, yet... |
699 SkASSERT(kBottomLeft_GrSurfaceOrigin != desc.fOrigin); | 699 SkASSERT(kBottomLeft_GrSurfaceOrigin != desc.fOrigin); |
700 | 700 |
701 if (-1 == width) { | 701 if (-1 == width) { |
702 width = desc.fWidth; | 702 width = desc.fWidth; |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
788 format, | 788 format, |
789 width, height)); | 789 width, height)); |
790 break; | 790 break; |
791 case GrGLCaps::kNone_MSFBOType: | 791 case GrGLCaps::kNone_MSFBOType: |
792 SkFAIL("Shouldn't be here if we don't support multisampled renderbuf
fers."); | 792 SkFAIL("Shouldn't be here if we don't support multisampled renderbuf
fers."); |
793 break; | 793 break; |
794 } | 794 } |
795 return (GR_GL_NO_ERROR == CHECK_ALLOC_ERROR(ctx.interface()));; | 795 return (GR_GL_NO_ERROR == CHECK_ALLOC_ERROR(ctx.interface()));; |
796 } | 796 } |
797 | 797 |
798 bool GrGpuGL::createRenderTargetObjects(const GrSurfaceDesc& desc, GrGLuint texI
D, | 798 bool GrGLGpu::createRenderTargetObjects(const GrSurfaceDesc& desc, GrGLuint texI
D, |
799 GrGLRenderTarget::IDDesc* idDesc) { | 799 GrGLRenderTarget::IDDesc* idDesc) { |
800 idDesc->fMSColorRenderbufferID = 0; | 800 idDesc->fMSColorRenderbufferID = 0; |
801 idDesc->fRTFBOID = 0; | 801 idDesc->fRTFBOID = 0; |
802 idDesc->fTexFBOID = 0; | 802 idDesc->fTexFBOID = 0; |
803 idDesc->fIsWrapped = false; | 803 idDesc->fIsWrapped = false; |
804 | 804 |
805 GrGLenum status; | 805 GrGLenum status; |
806 | 806 |
807 GrGLenum msColorFormat = 0; // suppress warning | 807 GrGLenum msColorFormat = 0; // suppress warning |
808 | 808 |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
906 // SkDEBUGFAIL("null texture"); | 906 // SkDEBUGFAIL("null texture"); |
907 return NULL; | 907 return NULL; |
908 } | 908 } |
909 | 909 |
910 #if 0 && defined(SK_DEBUG) | 910 #if 0 && defined(SK_DEBUG) |
911 static size_t as_size_t(int x) { | 911 static size_t as_size_t(int x) { |
912 return x; | 912 return x; |
913 } | 913 } |
914 #endif | 914 #endif |
915 | 915 |
916 GrTexture* GrGpuGL::onCreateTexture(const GrSurfaceDesc& origDesc, | 916 GrTexture* GrGLGpu::onCreateTexture(const GrSurfaceDesc& origDesc, |
917 const void* srcData, | 917 const void* srcData, |
918 size_t rowBytes) { | 918 size_t rowBytes) { |
919 | 919 |
920 GrSurfaceDesc desc = origDesc; | 920 GrSurfaceDesc desc = origDesc; |
921 GrGLRenderTarget::IDDesc rtIDDesc; | 921 GrGLRenderTarget::IDDesc rtIDDesc; |
922 | 922 |
923 // Attempt to catch un- or wrongly initialized sample counts; | 923 // Attempt to catch un- or wrongly initialized sample counts; |
924 SkASSERT(desc.fSampleCnt >= 0 && desc.fSampleCnt <= 64); | 924 SkASSERT(desc.fSampleCnt >= 0 && desc.fSampleCnt <= 64); |
925 // We fail if the MSAA was requested and is not available. | 925 // We fail if the MSAA was requested and is not available. |
926 if (GrGLCaps::kNone_MSFBOType == this->glCaps().msFBOType() && desc.fSampleC
nt) { | 926 if (GrGLCaps::kNone_MSFBOType == this->glCaps().msFBOType() && desc.fSampleC
nt) { |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1017 tex = SkNEW_ARGS(GrGLTexture, (this, desc, idDesc)); | 1017 tex = SkNEW_ARGS(GrGLTexture, (this, desc, idDesc)); |
1018 } | 1018 } |
1019 tex->setCachedTexParams(initialTexParams, this->getResetTimestamp()); | 1019 tex->setCachedTexParams(initialTexParams, this->getResetTimestamp()); |
1020 #ifdef TRACE_TEXTURE_CREATION | 1020 #ifdef TRACE_TEXTURE_CREATION |
1021 SkDebugf("--- new texture [%d] size=(%d %d) config=%d\n", | 1021 SkDebugf("--- new texture [%d] size=(%d %d) config=%d\n", |
1022 glTexDesc.fTextureID, desc.fWidth, desc.fHeight, desc.fConfig); | 1022 glTexDesc.fTextureID, desc.fWidth, desc.fHeight, desc.fConfig); |
1023 #endif | 1023 #endif |
1024 return tex; | 1024 return tex; |
1025 } | 1025 } |
1026 | 1026 |
1027 GrTexture* GrGpuGL::onCreateCompressedTexture(const GrSurfaceDesc& origDesc, con
st void* srcData) { | 1027 GrTexture* GrGLGpu::onCreateCompressedTexture(const GrSurfaceDesc& origDesc, con
st void* srcData) { |
1028 | 1028 |
1029 if(SkToBool(origDesc.fFlags & kRenderTarget_GrSurfaceFlag) || origDesc.fSamp
leCnt > 0) { | 1029 if(SkToBool(origDesc.fFlags & kRenderTarget_GrSurfaceFlag) || origDesc.fSamp
leCnt > 0) { |
1030 return return_null_texture(); | 1030 return return_null_texture(); |
1031 } | 1031 } |
1032 | 1032 |
1033 // Make sure that we're not flipping Y. | 1033 // Make sure that we're not flipping Y. |
1034 GrSurfaceOrigin texOrigin = resolve_origin(origDesc.fOrigin, false); | 1034 GrSurfaceOrigin texOrigin = resolve_origin(origDesc.fOrigin, false); |
1035 if (kBottomLeft_GrSurfaceOrigin == texOrigin) { | 1035 if (kBottomLeft_GrSurfaceOrigin == texOrigin) { |
1036 return return_null_texture(); | 1036 return return_null_texture(); |
1037 } | 1037 } |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1111 GR_GL_RENDERBUFFER_DEPTH_SIZE, | 1111 GR_GL_RENDERBUFFER_DEPTH_SIZE, |
1112 (GrGLint*)&format->fTotalBits); | 1112 (GrGLint*)&format->fTotalBits); |
1113 format->fTotalBits += format->fStencilBits; | 1113 format->fTotalBits += format->fStencilBits; |
1114 } else { | 1114 } else { |
1115 format->fTotalBits = format->fStencilBits; | 1115 format->fTotalBits = format->fStencilBits; |
1116 } | 1116 } |
1117 } | 1117 } |
1118 } | 1118 } |
1119 } | 1119 } |
1120 | 1120 |
1121 bool GrGpuGL::createStencilBufferForRenderTarget(GrRenderTarget* rt, int width,
int height) { | 1121 bool GrGLGpu::createStencilBufferForRenderTarget(GrRenderTarget* rt, int width,
int height) { |
1122 | 1122 |
1123 // All internally created RTs are also textures. We don't create | 1123 // All internally created RTs are also textures. We don't create |
1124 // SBs for a client's standalone RT (that is a RT that isn't also a texture)
. | 1124 // SBs for a client's standalone RT (that is a RT that isn't also a texture)
. |
1125 SkASSERT(rt->asTexture()); | 1125 SkASSERT(rt->asTexture()); |
1126 SkASSERT(width >= rt->width()); | 1126 SkASSERT(width >= rt->width()); |
1127 SkASSERT(height >= rt->height()); | 1127 SkASSERT(height >= rt->height()); |
1128 | 1128 |
1129 int samples = rt->numSamples(); | 1129 int samples = rt->numSamples(); |
1130 GrGLuint sbID = 0; | 1130 GrGLuint sbID = 0; |
1131 | 1131 |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1176 // again. | 1176 // again. |
1177 sb->cacheAccess().removeScratchKey(); | 1177 sb->cacheAccess().removeScratchKey(); |
1178 // Set this to 0 since we handed the valid ID off to the failed sten
cil buffer resource. | 1178 // Set this to 0 since we handed the valid ID off to the failed sten
cil buffer resource. |
1179 sbID = 0; | 1179 sbID = 0; |
1180 } | 1180 } |
1181 } | 1181 } |
1182 GL_CALL(DeleteRenderbuffers(1, &sbID)); | 1182 GL_CALL(DeleteRenderbuffers(1, &sbID)); |
1183 return false; | 1183 return false; |
1184 } | 1184 } |
1185 | 1185 |
1186 bool GrGpuGL::attachStencilBufferToRenderTarget(GrStencilBuffer* sb, GrRenderTar
get* rt) { | 1186 bool GrGLGpu::attachStencilBufferToRenderTarget(GrStencilBuffer* sb, GrRenderTar
get* rt) { |
1187 GrGLRenderTarget* glrt = static_cast<GrGLRenderTarget*>(rt); | 1187 GrGLRenderTarget* glrt = static_cast<GrGLRenderTarget*>(rt); |
1188 | 1188 |
1189 GrGLuint fbo = glrt->renderFBOID(); | 1189 GrGLuint fbo = glrt->renderFBOID(); |
1190 | 1190 |
1191 if (NULL == sb) { | 1191 if (NULL == sb) { |
1192 if (rt->getStencilBuffer()) { | 1192 if (rt->getStencilBuffer()) { |
1193 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, | 1193 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, |
1194 GR_GL_STENCIL_ATTACHMENT, | 1194 GR_GL_STENCIL_ATTACHMENT, |
1195 GR_GL_RENDERBUFFER, 0)); | 1195 GR_GL_RENDERBUFFER, 0)); |
1196 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, | 1196 GL_CALL(FramebufferRenderbuffer(GR_GL_FRAMEBUFFER, |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1241 rt->config(), | 1241 rt->config(), |
1242 glsb->format()); | 1242 glsb->format()); |
1243 } | 1243 } |
1244 } | 1244 } |
1245 return true; | 1245 return true; |
1246 } | 1246 } |
1247 } | 1247 } |
1248 | 1248 |
1249 //////////////////////////////////////////////////////////////////////////////// | 1249 //////////////////////////////////////////////////////////////////////////////// |
1250 | 1250 |
1251 GrVertexBuffer* GrGpuGL::onCreateVertexBuffer(size_t size, bool dynamic) { | 1251 GrVertexBuffer* GrGLGpu::onCreateVertexBuffer(size_t size, bool dynamic) { |
1252 GrGLVertexBuffer::Desc desc; | 1252 GrGLVertexBuffer::Desc desc; |
1253 desc.fDynamic = dynamic; | 1253 desc.fDynamic = dynamic; |
1254 desc.fSizeInBytes = size; | 1254 desc.fSizeInBytes = size; |
1255 desc.fIsWrapped = false; | 1255 desc.fIsWrapped = false; |
1256 | 1256 |
1257 if (this->glCaps().useNonVBOVertexAndIndexDynamicData() && desc.fDynamic) { | 1257 if (this->glCaps().useNonVBOVertexAndIndexDynamicData() && desc.fDynamic) { |
1258 desc.fID = 0; | 1258 desc.fID = 0; |
1259 GrGLVertexBuffer* vertexBuffer = SkNEW_ARGS(GrGLVertexBuffer, (this, des
c)); | 1259 GrGLVertexBuffer* vertexBuffer = SkNEW_ARGS(GrGLVertexBuffer, (this, des
c)); |
1260 return vertexBuffer; | 1260 return vertexBuffer; |
1261 } else { | 1261 } else { |
(...skipping 12 matching lines...) Expand all Loading... |
1274 this->notifyVertexBufferDelete(desc.fID); | 1274 this->notifyVertexBufferDelete(desc.fID); |
1275 return NULL; | 1275 return NULL; |
1276 } | 1276 } |
1277 GrGLVertexBuffer* vertexBuffer = SkNEW_ARGS(GrGLVertexBuffer, (this,
desc)); | 1277 GrGLVertexBuffer* vertexBuffer = SkNEW_ARGS(GrGLVertexBuffer, (this,
desc)); |
1278 return vertexBuffer; | 1278 return vertexBuffer; |
1279 } | 1279 } |
1280 return NULL; | 1280 return NULL; |
1281 } | 1281 } |
1282 } | 1282 } |
1283 | 1283 |
1284 GrIndexBuffer* GrGpuGL::onCreateIndexBuffer(size_t size, bool dynamic) { | 1284 GrIndexBuffer* GrGLGpu::onCreateIndexBuffer(size_t size, bool dynamic) { |
1285 GrGLIndexBuffer::Desc desc; | 1285 GrGLIndexBuffer::Desc desc; |
1286 desc.fDynamic = dynamic; | 1286 desc.fDynamic = dynamic; |
1287 desc.fSizeInBytes = size; | 1287 desc.fSizeInBytes = size; |
1288 desc.fIsWrapped = false; | 1288 desc.fIsWrapped = false; |
1289 | 1289 |
1290 if (this->glCaps().useNonVBOVertexAndIndexDynamicData() && desc.fDynamic) { | 1290 if (this->glCaps().useNonVBOVertexAndIndexDynamicData() && desc.fDynamic) { |
1291 desc.fID = 0; | 1291 desc.fID = 0; |
1292 GrIndexBuffer* indexBuffer = SkNEW_ARGS(GrGLIndexBuffer, (this, desc)); | 1292 GrIndexBuffer* indexBuffer = SkNEW_ARGS(GrGLIndexBuffer, (this, desc)); |
1293 return indexBuffer; | 1293 return indexBuffer; |
1294 } else { | 1294 } else { |
(...skipping 12 matching lines...) Expand all Loading... |
1307 this->notifyIndexBufferDelete(desc.fID); | 1307 this->notifyIndexBufferDelete(desc.fID); |
1308 return NULL; | 1308 return NULL; |
1309 } | 1309 } |
1310 GrIndexBuffer* indexBuffer = SkNEW_ARGS(GrGLIndexBuffer, (this, desc
)); | 1310 GrIndexBuffer* indexBuffer = SkNEW_ARGS(GrGLIndexBuffer, (this, desc
)); |
1311 return indexBuffer; | 1311 return indexBuffer; |
1312 } | 1312 } |
1313 return NULL; | 1313 return NULL; |
1314 } | 1314 } |
1315 } | 1315 } |
1316 | 1316 |
1317 void GrGpuGL::flushScissor(const GrClipMaskManager::ScissorState& scissorState, | 1317 void GrGLGpu::flushScissor(const GrClipMaskManager::ScissorState& scissorState, |
1318 const GrGLIRect& rtViewport, | 1318 const GrGLIRect& rtViewport, |
1319 GrSurfaceOrigin rtOrigin) { | 1319 GrSurfaceOrigin rtOrigin) { |
1320 if (scissorState.fEnabled) { | 1320 if (scissorState.fEnabled) { |
1321 GrGLIRect scissor; | 1321 GrGLIRect scissor; |
1322 scissor.setRelativeTo(rtViewport, | 1322 scissor.setRelativeTo(rtViewport, |
1323 scissorState.fRect.fLeft, | 1323 scissorState.fRect.fLeft, |
1324 scissorState.fRect.fTop, | 1324 scissorState.fRect.fTop, |
1325 scissorState.fRect.width(), | 1325 scissorState.fRect.width(), |
1326 scissorState.fRect.height(), | 1326 scissorState.fRect.height(), |
1327 rtOrigin); | 1327 rtOrigin); |
1328 // if the scissor fully contains the viewport then we fall through and | 1328 // if the scissor fully contains the viewport then we fall through and |
1329 // disable the scissor test. | 1329 // disable the scissor test. |
1330 if (!scissor.contains(rtViewport)) { | 1330 if (!scissor.contains(rtViewport)) { |
1331 if (fHWScissorSettings.fRect != scissor) { | 1331 if (fHWScissorSettings.fRect != scissor) { |
1332 scissor.pushToGLScissor(this->glInterface()); | 1332 scissor.pushToGLScissor(this->glInterface()); |
1333 fHWScissorSettings.fRect = scissor; | 1333 fHWScissorSettings.fRect = scissor; |
1334 } | 1334 } |
1335 if (kYes_TriState != fHWScissorSettings.fEnabled) { | 1335 if (kYes_TriState != fHWScissorSettings.fEnabled) { |
1336 GL_CALL(Enable(GR_GL_SCISSOR_TEST)); | 1336 GL_CALL(Enable(GR_GL_SCISSOR_TEST)); |
1337 fHWScissorSettings.fEnabled = kYes_TriState; | 1337 fHWScissorSettings.fEnabled = kYes_TriState; |
1338 } | 1338 } |
1339 return; | 1339 return; |
1340 } | 1340 } |
1341 } | 1341 } |
1342 | 1342 |
1343 // See fall through note above | 1343 // See fall through note above |
1344 this->disableScissor(); | 1344 this->disableScissor(); |
1345 } | 1345 } |
1346 | 1346 |
1347 bool GrGpuGL::flushGraphicsState(const GrOptDrawState& optState) { | 1347 bool GrGLGpu::flushGraphicsState(const GrOptDrawState& optState) { |
1348 // GrGpu::setupClipAndFlushState should have already checked this and bailed
if not true. | 1348 // GrGpu::setupClipAndFlushState should have already checked this and bailed
if not true. |
1349 SkASSERT(optState.getRenderTarget()); | 1349 SkASSERT(optState.getRenderTarget()); |
1350 | 1350 |
1351 if (kStencilPath_DrawType == optState.drawType()) { | 1351 if (kStencilPath_DrawType == optState.drawType()) { |
1352 const GrRenderTarget* rt = optState.getRenderTarget(); | 1352 const GrRenderTarget* rt = optState.getRenderTarget(); |
1353 SkISize size; | 1353 SkISize size; |
1354 size.set(rt->width(), rt->height()); | 1354 size.set(rt->width(), rt->height()); |
1355 this->glPathRendering()->setProjectionMatrix(optState.getViewMatrix(), s
ize, rt->origin()); | 1355 this->glPathRendering()->setProjectionMatrix(optState.getViewMatrix(), s
ize, rt->origin()); |
1356 } else { | 1356 } else { |
1357 this->flushMiscFixedFunctionState(optState); | 1357 this->flushMiscFixedFunctionState(optState); |
(...skipping 22 matching lines...) Expand all Loading... |
1380 this->flushScissor(optState.getScissorState(), glRT->getViewport(), glRT->or
igin()); | 1380 this->flushScissor(optState.getScissorState(), glRT->getViewport(), glRT->or
igin()); |
1381 this->flushAAState(optState); | 1381 this->flushAAState(optState); |
1382 | 1382 |
1383 // This must come after textures are flushed because a texture may need | 1383 // This must come after textures are flushed because a texture may need |
1384 // to be msaa-resolved (which will modify bound FBO state). | 1384 // to be msaa-resolved (which will modify bound FBO state). |
1385 this->flushRenderTarget(glRT, NULL); | 1385 this->flushRenderTarget(glRT, NULL); |
1386 | 1386 |
1387 return true; | 1387 return true; |
1388 } | 1388 } |
1389 | 1389 |
1390 void GrGpuGL::setupGeometry(const GrOptDrawState& optState, | 1390 void GrGLGpu::setupGeometry(const GrOptDrawState& optState, |
1391 const GrDrawTarget::DrawInfo& info, | 1391 const GrDrawTarget::DrawInfo& info, |
1392 size_t* indexOffsetInBytes) { | 1392 size_t* indexOffsetInBytes) { |
1393 GrGLVertexBuffer* vbuf; | 1393 GrGLVertexBuffer* vbuf; |
1394 vbuf = (GrGLVertexBuffer*) info.vertexBuffer(); | 1394 vbuf = (GrGLVertexBuffer*) info.vertexBuffer(); |
1395 | 1395 |
1396 SkASSERT(vbuf); | 1396 SkASSERT(vbuf); |
1397 SkASSERT(!vbuf->isMapped()); | 1397 SkASSERT(!vbuf->isMapped()); |
1398 | 1398 |
1399 GrGLIndexBuffer* ibuf = NULL; | 1399 GrGLIndexBuffer* ibuf = NULL; |
1400 if (info.isIndexed()) { | 1400 if (info.isIndexed()) { |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1434 GrGLAttribTypeToLayout(attribType).fType, | 1434 GrGLAttribTypeToLayout(attribType).fType, |
1435 GrGLAttribTypeToLayout(attribType).fNormalized, | 1435 GrGLAttribTypeToLayout(attribType).fNormalized, |
1436 stride, | 1436 stride, |
1437 reinterpret_cast<GrGLvoid*>(vertexOffsetInBytes + o
ffset)); | 1437 reinterpret_cast<GrGLvoid*>(vertexOffsetInBytes + o
ffset)); |
1438 offset += attribs[attribIndex].fOffset; | 1438 offset += attribs[attribIndex].fOffset; |
1439 } | 1439 } |
1440 attribState->disableUnusedArrays(this, usedAttribArraysMask); | 1440 attribState->disableUnusedArrays(this, usedAttribArraysMask); |
1441 } | 1441 } |
1442 } | 1442 } |
1443 | 1443 |
1444 void GrGpuGL::buildProgramDesc(const GrOptDrawState& optState, | 1444 void GrGLGpu::buildProgramDesc(const GrOptDrawState& optState, |
1445 const GrProgramDesc::DescInfo& descInfo, | 1445 const GrProgramDesc::DescInfo& descInfo, |
1446 GrGpu::DrawType drawType, | 1446 GrGpu::DrawType drawType, |
1447 GrProgramDesc* desc) { | 1447 GrProgramDesc* desc) { |
1448 if (!GrGLProgramDescBuilder::Build(optState, descInfo, drawType, this, desc)
) { | 1448 if (!GrGLProgramDescBuilder::Build(optState, descInfo, drawType, this, desc)
) { |
1449 SkDEBUGFAIL("Failed to generate GL program descriptor"); | 1449 SkDEBUGFAIL("Failed to generate GL program descriptor"); |
1450 } | 1450 } |
1451 } | 1451 } |
1452 | 1452 |
1453 void GrGpuGL::disableScissor() { | 1453 void GrGLGpu::disableScissor() { |
1454 if (kNo_TriState != fHWScissorSettings.fEnabled) { | 1454 if (kNo_TriState != fHWScissorSettings.fEnabled) { |
1455 GL_CALL(Disable(GR_GL_SCISSOR_TEST)); | 1455 GL_CALL(Disable(GR_GL_SCISSOR_TEST)); |
1456 fHWScissorSettings.fEnabled = kNo_TriState; | 1456 fHWScissorSettings.fEnabled = kNo_TriState; |
1457 return; | 1457 return; |
1458 } | 1458 } |
1459 } | 1459 } |
1460 | 1460 |
1461 void GrGpuGL::onClear(GrRenderTarget* target, const SkIRect* rect, GrColor color
, | 1461 void GrGLGpu::onClear(GrRenderTarget* target, const SkIRect* rect, GrColor color
, |
1462 bool canIgnoreRect) { | 1462 bool canIgnoreRect) { |
1463 // parent class should never let us get here with no RT | 1463 // parent class should never let us get here with no RT |
1464 SkASSERT(target); | 1464 SkASSERT(target); |
1465 GrGLRenderTarget* glRT = static_cast<GrGLRenderTarget*>(target); | 1465 GrGLRenderTarget* glRT = static_cast<GrGLRenderTarget*>(target); |
1466 | 1466 |
1467 if (canIgnoreRect && this->glCaps().fullClearIsFree()) { | 1467 if (canIgnoreRect && this->glCaps().fullClearIsFree()) { |
1468 rect = NULL; | 1468 rect = NULL; |
1469 } | 1469 } |
1470 | 1470 |
1471 SkIRect clippedRect; | 1471 SkIRect clippedRect; |
(...skipping 23 matching lines...) Expand all Loading... |
1495 r = GrColorUnpackR(color) * scaleRGB; | 1495 r = GrColorUnpackR(color) * scaleRGB; |
1496 g = GrColorUnpackG(color) * scaleRGB; | 1496 g = GrColorUnpackG(color) * scaleRGB; |
1497 b = GrColorUnpackB(color) * scaleRGB; | 1497 b = GrColorUnpackB(color) * scaleRGB; |
1498 | 1498 |
1499 GL_CALL(ColorMask(GR_GL_TRUE, GR_GL_TRUE, GR_GL_TRUE, GR_GL_TRUE)); | 1499 GL_CALL(ColorMask(GR_GL_TRUE, GR_GL_TRUE, GR_GL_TRUE, GR_GL_TRUE)); |
1500 fHWWriteToColor = kYes_TriState; | 1500 fHWWriteToColor = kYes_TriState; |
1501 GL_CALL(ClearColor(r, g, b, a)); | 1501 GL_CALL(ClearColor(r, g, b, a)); |
1502 GL_CALL(Clear(GR_GL_COLOR_BUFFER_BIT)); | 1502 GL_CALL(Clear(GR_GL_COLOR_BUFFER_BIT)); |
1503 } | 1503 } |
1504 | 1504 |
1505 void GrGpuGL::discard(GrRenderTarget* renderTarget) { | 1505 void GrGLGpu::discard(GrRenderTarget* renderTarget) { |
1506 SkASSERT(renderTarget); | 1506 SkASSERT(renderTarget); |
1507 if (!this->caps()->discardRenderTargetSupport()) { | 1507 if (!this->caps()->discardRenderTargetSupport()) { |
1508 return; | 1508 return; |
1509 } | 1509 } |
1510 | 1510 |
1511 GrGLRenderTarget* glRT = static_cast<GrGLRenderTarget*>(renderTarget); | 1511 GrGLRenderTarget* glRT = static_cast<GrGLRenderTarget*>(renderTarget); |
1512 if (renderTarget->getUniqueID() != fHWBoundRenderTargetUniqueID) { | 1512 if (renderTarget->getUniqueID() != fHWBoundRenderTargetUniqueID) { |
1513 fHWBoundRenderTargetUniqueID = SK_InvalidUniqueID; | 1513 fHWBoundRenderTargetUniqueID = SK_InvalidUniqueID; |
1514 fGPUStats.incRenderTargetBinds(); | 1514 fGPUStats.incRenderTargetBinds(); |
1515 GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, glRT->renderFBOID())); | 1515 GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, glRT->renderFBOID())); |
(...skipping 29 matching lines...) Expand all Loading... |
1545 GL_CALL(DiscardFramebuffer(GR_GL_FRAMEBUFFER, SK_ARRAY_COUNT(att
achments), | 1545 GL_CALL(DiscardFramebuffer(GR_GL_FRAMEBUFFER, SK_ARRAY_COUNT(att
achments), |
1546 attachments)); | 1546 attachments)); |
1547 } | 1547 } |
1548 break; | 1548 break; |
1549 } | 1549 } |
1550 } | 1550 } |
1551 renderTarget->flagAsResolved(); | 1551 renderTarget->flagAsResolved(); |
1552 } | 1552 } |
1553 | 1553 |
1554 | 1554 |
1555 void GrGpuGL::clearStencil(GrRenderTarget* target) { | 1555 void GrGLGpu::clearStencil(GrRenderTarget* target) { |
1556 if (NULL == target) { | 1556 if (NULL == target) { |
1557 return; | 1557 return; |
1558 } | 1558 } |
1559 GrGLRenderTarget* glRT = static_cast<GrGLRenderTarget*>(target); | 1559 GrGLRenderTarget* glRT = static_cast<GrGLRenderTarget*>(target); |
1560 this->flushRenderTarget(glRT, &SkIRect::EmptyIRect()); | 1560 this->flushRenderTarget(glRT, &SkIRect::EmptyIRect()); |
1561 | 1561 |
1562 this->disableScissor(); | 1562 this->disableScissor(); |
1563 | 1563 |
1564 GL_CALL(StencilMask(0xffffffff)); | 1564 GL_CALL(StencilMask(0xffffffff)); |
1565 GL_CALL(ClearStencil(0)); | 1565 GL_CALL(ClearStencil(0)); |
1566 GL_CALL(Clear(GR_GL_STENCIL_BUFFER_BIT)); | 1566 GL_CALL(Clear(GR_GL_STENCIL_BUFFER_BIT)); |
1567 fHWStencilSettings.invalidate(); | 1567 fHWStencilSettings.invalidate(); |
1568 } | 1568 } |
1569 | 1569 |
1570 void GrGpuGL::onClearStencilClip(GrRenderTarget* target, const SkIRect& rect, bo
ol insideClip) { | 1570 void GrGLGpu::onClearStencilClip(GrRenderTarget* target, const SkIRect& rect, bo
ol insideClip) { |
1571 SkASSERT(target); | 1571 SkASSERT(target); |
1572 | 1572 |
1573 // this should only be called internally when we know we have a | 1573 // this should only be called internally when we know we have a |
1574 // stencil buffer. | 1574 // stencil buffer. |
1575 SkASSERT(target->getStencilBuffer()); | 1575 SkASSERT(target->getStencilBuffer()); |
1576 GrGLint stencilBitCount = target->getStencilBuffer()->bits(); | 1576 GrGLint stencilBitCount = target->getStencilBuffer()->bits(); |
1577 #if 0 | 1577 #if 0 |
1578 SkASSERT(stencilBitCount > 0); | 1578 SkASSERT(stencilBitCount > 0); |
1579 GrGLint clipStencilMask = (1 << (stencilBitCount - 1)); | 1579 GrGLint clipStencilMask = (1 << (stencilBitCount - 1)); |
1580 #else | 1580 #else |
(...skipping 17 matching lines...) Expand all Loading... |
1598 scissorState.fEnabled = true; | 1598 scissorState.fEnabled = true; |
1599 scissorState.fRect = rect; | 1599 scissorState.fRect = rect; |
1600 this->flushScissor(scissorState, glRT->getViewport(), glRT->origin()); | 1600 this->flushScissor(scissorState, glRT->getViewport(), glRT->origin()); |
1601 | 1601 |
1602 GL_CALL(StencilMask((uint32_t) clipStencilMask)); | 1602 GL_CALL(StencilMask((uint32_t) clipStencilMask)); |
1603 GL_CALL(ClearStencil(value)); | 1603 GL_CALL(ClearStencil(value)); |
1604 GL_CALL(Clear(GR_GL_STENCIL_BUFFER_BIT)); | 1604 GL_CALL(Clear(GR_GL_STENCIL_BUFFER_BIT)); |
1605 fHWStencilSettings.invalidate(); | 1605 fHWStencilSettings.invalidate(); |
1606 } | 1606 } |
1607 | 1607 |
1608 bool GrGpuGL::readPixelsWillPayForYFlip(GrRenderTarget* renderTarget, | 1608 bool GrGLGpu::readPixelsWillPayForYFlip(GrRenderTarget* renderTarget, |
1609 int left, int top, | 1609 int left, int top, |
1610 int width, int height, | 1610 int width, int height, |
1611 GrPixelConfig config, | 1611 GrPixelConfig config, |
1612 size_t rowBytes) const { | 1612 size_t rowBytes) const { |
1613 // If this rendertarget is aready TopLeft, we don't need to flip. | 1613 // If this rendertarget is aready TopLeft, we don't need to flip. |
1614 if (kTopLeft_GrSurfaceOrigin == renderTarget->origin()) { | 1614 if (kTopLeft_GrSurfaceOrigin == renderTarget->origin()) { |
1615 return false; | 1615 return false; |
1616 } | 1616 } |
1617 | 1617 |
1618 // if GL can do the flip then we'll never pay for it. | 1618 // if GL can do the flip then we'll never pay for it. |
(...skipping 10 matching lines...) Expand all Loading... |
1629 // Note the rowBytes might be tight to the passed in data, but if data | 1629 // Note the rowBytes might be tight to the passed in data, but if data |
1630 // gets clipped in x to the target the rowBytes will no longer be tight. | 1630 // gets clipped in x to the target the rowBytes will no longer be tight. |
1631 if (left >= 0 && (left + width) < renderTarget->width()) { | 1631 if (left >= 0 && (left + width) < renderTarget->width()) { |
1632 return 0 == rowBytes || | 1632 return 0 == rowBytes || |
1633 GrBytesPerPixel(config) * width == rowBytes; | 1633 GrBytesPerPixel(config) * width == rowBytes; |
1634 } else { | 1634 } else { |
1635 return false; | 1635 return false; |
1636 } | 1636 } |
1637 } | 1637 } |
1638 | 1638 |
1639 bool GrGpuGL::onReadPixels(GrRenderTarget* target, | 1639 bool GrGLGpu::onReadPixels(GrRenderTarget* target, |
1640 int left, int top, | 1640 int left, int top, |
1641 int width, int height, | 1641 int width, int height, |
1642 GrPixelConfig config, | 1642 GrPixelConfig config, |
1643 void* buffer, | 1643 void* buffer, |
1644 size_t rowBytes) { | 1644 size_t rowBytes) { |
1645 // We cannot read pixels into a compressed buffer | 1645 // We cannot read pixels into a compressed buffer |
1646 if (GrPixelConfigIsCompressed(config)) { | 1646 if (GrPixelConfigIsCompressed(config)) { |
1647 return false; | 1647 return false; |
1648 } | 1648 } |
1649 | 1649 |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1757 if (!flipY) { | 1757 if (!flipY) { |
1758 dst += rowBytes; | 1758 dst += rowBytes; |
1759 } else { | 1759 } else { |
1760 dst -= rowBytes; | 1760 dst -= rowBytes; |
1761 } | 1761 } |
1762 } | 1762 } |
1763 } | 1763 } |
1764 return true; | 1764 return true; |
1765 } | 1765 } |
1766 | 1766 |
1767 void GrGpuGL::flushRenderTarget(GrGLRenderTarget* target, const SkIRect* bound)
{ | 1767 void GrGLGpu::flushRenderTarget(GrGLRenderTarget* target, const SkIRect* bound)
{ |
1768 | 1768 |
1769 SkASSERT(target); | 1769 SkASSERT(target); |
1770 | 1770 |
1771 uint32_t rtID = target->getUniqueID(); | 1771 uint32_t rtID = target->getUniqueID(); |
1772 if (fHWBoundRenderTargetUniqueID != rtID) { | 1772 if (fHWBoundRenderTargetUniqueID != rtID) { |
1773 fGPUStats.incRenderTargetBinds(); | 1773 fGPUStats.incRenderTargetBinds(); |
1774 GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, target->renderFBOID())); | 1774 GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, target->renderFBOID())); |
1775 #ifdef SK_DEBUG | 1775 #ifdef SK_DEBUG |
1776 // don't do this check in Chromium -- this is causing | 1776 // don't do this check in Chromium -- this is causing |
1777 // lots of repeated command buffer flushes when the compositor is | 1777 // lots of repeated command buffer flushes when the compositor is |
1778 // rendering with Ganesh, which is really slow; even too slow for | 1778 // rendering with Ganesh, which is really slow; even too slow for |
1779 // Debug mode. | 1779 // Debug mode. |
1780 if (!this->glContext().isChromium()) { | 1780 if (!this->glContext().isChromium()) { |
1781 GrGLenum status; | 1781 GrGLenum status; |
1782 GL_CALL_RET(status, CheckFramebufferStatus(GR_GL_FRAMEBUFFER)); | 1782 GL_CALL_RET(status, CheckFramebufferStatus(GR_GL_FRAMEBUFFER)); |
1783 if (status != GR_GL_FRAMEBUFFER_COMPLETE) { | 1783 if (status != GR_GL_FRAMEBUFFER_COMPLETE) { |
1784 SkDebugf("GrGpuGL::flushRenderTarget glCheckFramebufferStatus %x
\n", status); | 1784 SkDebugf("GrGLGpu::flushRenderTarget glCheckFramebufferStatus %x
\n", status); |
1785 } | 1785 } |
1786 } | 1786 } |
1787 #endif | 1787 #endif |
1788 fHWBoundRenderTargetUniqueID = rtID; | 1788 fHWBoundRenderTargetUniqueID = rtID; |
1789 const GrGLIRect& vp = target->getViewport(); | 1789 const GrGLIRect& vp = target->getViewport(); |
1790 if (fHWViewport != vp) { | 1790 if (fHWViewport != vp) { |
1791 vp.pushToGLViewport(this->glInterface()); | 1791 vp.pushToGLViewport(this->glInterface()); |
1792 fHWViewport = vp; | 1792 fHWViewport = vp; |
1793 } | 1793 } |
1794 } | 1794 } |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1826 GetWindowThreadProcessId(hwnd, &wndProcID); | 1826 GetWindowThreadProcessId(hwnd, &wndProcID); |
1827 if(wndProcID == procID) { | 1827 if(wndProcID == procID) { |
1828 SwapBuffers(GetDC(hwnd)); | 1828 SwapBuffers(GetDC(hwnd)); |
1829 } | 1829 } |
1830 hwnd = GetNextWindow(hwnd, GW_HWNDNEXT); | 1830 hwnd = GetNextWindow(hwnd, GW_HWNDNEXT); |
1831 } | 1831 } |
1832 } | 1832 } |
1833 #endif | 1833 #endif |
1834 #endif | 1834 #endif |
1835 | 1835 |
1836 void GrGpuGL::onDraw(const GrOptDrawState& ds, const GrDrawTarget::DrawInfo& inf
o) { | 1836 void GrGLGpu::onDraw(const GrOptDrawState& ds, const GrDrawTarget::DrawInfo& inf
o) { |
1837 size_t indexOffsetInBytes; | 1837 size_t indexOffsetInBytes; |
1838 this->setupGeometry(ds, info, &indexOffsetInBytes); | 1838 this->setupGeometry(ds, info, &indexOffsetInBytes); |
1839 | 1839 |
1840 SkASSERT((size_t)info.primitiveType() < SK_ARRAY_COUNT(gPrimitiveType2GLMode
)); | 1840 SkASSERT((size_t)info.primitiveType() < SK_ARRAY_COUNT(gPrimitiveType2GLMode
)); |
1841 | 1841 |
1842 if (info.isIndexed()) { | 1842 if (info.isIndexed()) { |
1843 GrGLvoid* indices = | 1843 GrGLvoid* indices = |
1844 reinterpret_cast<GrGLvoid*>(indexOffsetInBytes + sizeof(uint16_t) *
info.startIndex()); | 1844 reinterpret_cast<GrGLvoid*>(indexOffsetInBytes + sizeof(uint16_t) *
info.startIndex()); |
1845 // info.startVertex() was accounted for by setupGeometry. | 1845 // info.startVertex() was accounted for by setupGeometry. |
1846 GL_CALL(DrawElements(gPrimitiveType2GLMode[info.primitiveType()], | 1846 GL_CALL(DrawElements(gPrimitiveType2GLMode[info.primitiveType()], |
(...skipping 13 matching lines...) Expand all Loading... |
1860 int set_a_break_pt_here = 9; | 1860 int set_a_break_pt_here = 9; |
1861 aglSwapBuffers(aglGetCurrentContext()); | 1861 aglSwapBuffers(aglGetCurrentContext()); |
1862 #elif defined(SK_BUILD_FOR_WIN32) | 1862 #elif defined(SK_BUILD_FOR_WIN32) |
1863 SwapBuf(); | 1863 SwapBuf(); |
1864 int set_a_break_pt_here = 9; | 1864 int set_a_break_pt_here = 9; |
1865 SwapBuf(); | 1865 SwapBuf(); |
1866 #endif | 1866 #endif |
1867 #endif | 1867 #endif |
1868 } | 1868 } |
1869 | 1869 |
1870 void GrGpuGL::onResolveRenderTarget(GrRenderTarget* target) { | 1870 void GrGLGpu::onResolveRenderTarget(GrRenderTarget* target) { |
1871 GrGLRenderTarget* rt = static_cast<GrGLRenderTarget*>(target); | 1871 GrGLRenderTarget* rt = static_cast<GrGLRenderTarget*>(target); |
1872 if (rt->needsResolve()) { | 1872 if (rt->needsResolve()) { |
1873 // Some extensions automatically resolves the texture when it is read. | 1873 // Some extensions automatically resolves the texture when it is read. |
1874 if (this->glCaps().usesMSAARenderBuffers()) { | 1874 if (this->glCaps().usesMSAARenderBuffers()) { |
1875 SkASSERT(rt->textureFBOID() != rt->renderFBOID()); | 1875 SkASSERT(rt->textureFBOID() != rt->renderFBOID()); |
1876 fGPUStats.incRenderTargetBinds(); | 1876 fGPUStats.incRenderTargetBinds(); |
1877 fGPUStats.incRenderTargetBinds(); | 1877 fGPUStats.incRenderTargetBinds(); |
1878 GL_CALL(BindFramebuffer(GR_GL_READ_FRAMEBUFFER, rt->renderFBOID())); | 1878 GL_CALL(BindFramebuffer(GR_GL_READ_FRAMEBUFFER, rt->renderFBOID())); |
1879 GL_CALL(BindFramebuffer(GR_GL_DRAW_FRAMEBUFFER, rt->textureFBOID()))
; | 1879 GL_CALL(BindFramebuffer(GR_GL_DRAW_FRAMEBUFFER, rt->textureFBOID()))
; |
1880 // make sure we go through flushRenderTarget() since we've modified | 1880 // make sure we go through flushRenderTarget() since we've modified |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1954 GR_GL_CALL(gl, StencilMask(writeMask)); | 1954 GR_GL_CALL(gl, StencilMask(writeMask)); |
1955 GR_GL_CALL(gl, StencilOp(glFailOp, glPassOp, glPassOp)); | 1955 GR_GL_CALL(gl, StencilOp(glFailOp, glPassOp, glPassOp)); |
1956 } else { | 1956 } else { |
1957 GR_GL_CALL(gl, StencilFuncSeparate(glFace, glFunc, ref, mask)); | 1957 GR_GL_CALL(gl, StencilFuncSeparate(glFace, glFunc, ref, mask)); |
1958 GR_GL_CALL(gl, StencilMaskSeparate(glFace, writeMask)); | 1958 GR_GL_CALL(gl, StencilMaskSeparate(glFace, writeMask)); |
1959 GR_GL_CALL(gl, StencilOpSeparate(glFace, glFailOp, glPassOp, glPassOp)); | 1959 GR_GL_CALL(gl, StencilOpSeparate(glFace, glFailOp, glPassOp, glPassOp)); |
1960 } | 1960 } |
1961 } | 1961 } |
1962 } | 1962 } |
1963 | 1963 |
1964 void GrGpuGL::flushStencil(const GrStencilSettings& stencilSettings, DrawType ty
pe) { | 1964 void GrGLGpu::flushStencil(const GrStencilSettings& stencilSettings, DrawType ty
pe) { |
1965 // TODO figure out why we need to flush stencil settings on path draws at al
l | 1965 // TODO figure out why we need to flush stencil settings on path draws at al
l |
1966 if (kStencilPath_DrawType != type && fHWStencilSettings != stencilSettings)
{ | 1966 if (kStencilPath_DrawType != type && fHWStencilSettings != stencilSettings)
{ |
1967 if (stencilSettings.isDisabled()) { | 1967 if (stencilSettings.isDisabled()) { |
1968 if (kNo_TriState != fHWStencilTestEnabled) { | 1968 if (kNo_TriState != fHWStencilTestEnabled) { |
1969 GL_CALL(Disable(GR_GL_STENCIL_TEST)); | 1969 GL_CALL(Disable(GR_GL_STENCIL_TEST)); |
1970 fHWStencilTestEnabled = kNo_TriState; | 1970 fHWStencilTestEnabled = kNo_TriState; |
1971 } | 1971 } |
1972 } else { | 1972 } else { |
1973 if (kYes_TriState != fHWStencilTestEnabled) { | 1973 if (kYes_TriState != fHWStencilTestEnabled) { |
1974 GL_CALL(Enable(GR_GL_STENCIL_TEST)); | 1974 GL_CALL(Enable(GR_GL_STENCIL_TEST)); |
(...skipping 14 matching lines...) Expand all Loading... |
1989 set_gl_stencil(this->glInterface(), | 1989 set_gl_stencil(this->glInterface(), |
1990 stencilSettings, | 1990 stencilSettings, |
1991 GR_GL_FRONT_AND_BACK, | 1991 GR_GL_FRONT_AND_BACK, |
1992 GrStencilSettings::kFront_Face); | 1992 GrStencilSettings::kFront_Face); |
1993 } | 1993 } |
1994 } | 1994 } |
1995 fHWStencilSettings = stencilSettings; | 1995 fHWStencilSettings = stencilSettings; |
1996 } | 1996 } |
1997 } | 1997 } |
1998 | 1998 |
1999 void GrGpuGL::flushAAState(const GrOptDrawState& optState) { | 1999 void GrGLGpu::flushAAState(const GrOptDrawState& optState) { |
2000 // At least some ATI linux drivers will render GL_LINES incorrectly when MSAA st
ate is enabled but | 2000 // At least some ATI linux drivers will render GL_LINES incorrectly when MSAA st
ate is enabled but |
2001 // the target is not multisampled. Single pixel wide lines are rendered thicker
than 1 pixel wide. | 2001 // the target is not multisampled. Single pixel wide lines are rendered thicker
than 1 pixel wide. |
2002 #if 0 | 2002 #if 0 |
2003 // Replace RT_HAS_MSAA with this definition once this driver bug is no longe
r a relevant concern | 2003 // Replace RT_HAS_MSAA with this definition once this driver bug is no longe
r a relevant concern |
2004 #define RT_HAS_MSAA rt->isMultisampled() | 2004 #define RT_HAS_MSAA rt->isMultisampled() |
2005 #else | 2005 #else |
2006 #define RT_HAS_MSAA (rt->isMultisampled() || kDrawLines_DrawType == optState
.drawType()) | 2006 #define RT_HAS_MSAA (rt->isMultisampled() || kDrawLines_DrawType == optState
.drawType()) |
2007 #endif | 2007 #endif |
2008 | 2008 |
2009 const GrRenderTarget* rt = optState.getRenderTarget(); | 2009 const GrRenderTarget* rt = optState.getRenderTarget(); |
2010 if (kGL_GrGLStandard == this->glStandard()) { | 2010 if (kGL_GrGLStandard == this->glStandard()) { |
2011 if (RT_HAS_MSAA) { | 2011 if (RT_HAS_MSAA) { |
2012 bool enableMSAA = optState.isHWAntialiasState(); | 2012 bool enableMSAA = optState.isHWAntialiasState(); |
2013 if (enableMSAA) { | 2013 if (enableMSAA) { |
2014 if (kYes_TriState != fMSAAEnabled) { | 2014 if (kYes_TriState != fMSAAEnabled) { |
2015 GL_CALL(Enable(GR_GL_MULTISAMPLE)); | 2015 GL_CALL(Enable(GR_GL_MULTISAMPLE)); |
2016 fMSAAEnabled = kYes_TriState; | 2016 fMSAAEnabled = kYes_TriState; |
2017 } | 2017 } |
2018 } else { | 2018 } else { |
2019 if (kNo_TriState != fMSAAEnabled) { | 2019 if (kNo_TriState != fMSAAEnabled) { |
2020 GL_CALL(Disable(GR_GL_MULTISAMPLE)); | 2020 GL_CALL(Disable(GR_GL_MULTISAMPLE)); |
2021 fMSAAEnabled = kNo_TriState; | 2021 fMSAAEnabled = kNo_TriState; |
2022 } | 2022 } |
2023 } | 2023 } |
2024 } | 2024 } |
2025 } | 2025 } |
2026 } | 2026 } |
2027 | 2027 |
2028 void GrGpuGL::flushBlend(const GrOptDrawState& optState) { | 2028 void GrGLGpu::flushBlend(const GrOptDrawState& optState) { |
2029 // Any optimization to disable blending should have already been applied and | 2029 // Any optimization to disable blending should have already been applied and |
2030 // tweaked the coeffs to (1, 0). | 2030 // tweaked the coeffs to (1, 0). |
2031 | 2031 |
2032 GrXferProcessor::BlendInfo blendInfo; | 2032 GrXferProcessor::BlendInfo blendInfo; |
2033 optState.getXferProcessor()->getBlendInfo(&blendInfo); | 2033 optState.getXferProcessor()->getBlendInfo(&blendInfo); |
2034 GrBlendCoeff srcCoeff = blendInfo.fSrcBlend; | 2034 GrBlendCoeff srcCoeff = blendInfo.fSrcBlend; |
2035 GrBlendCoeff dstCoeff = blendInfo.fDstBlend; | 2035 GrBlendCoeff dstCoeff = blendInfo.fDstBlend; |
2036 bool blendOff = kOne_GrBlendCoeff == srcCoeff && kZero_GrBlendCoeff == dstCo
eff; | 2036 bool blendOff = kOne_GrBlendCoeff == srcCoeff && kZero_GrBlendCoeff == dstCo
eff; |
2037 if (blendOff) { | 2037 if (blendOff) { |
2038 if (kNo_TriState != fHWBlendState.fEnabled) { | 2038 if (kNo_TriState != fHWBlendState.fEnabled) { |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2071 GR_GL_REPEAT, | 2071 GR_GL_REPEAT, |
2072 GR_GL_MIRRORED_REPEAT | 2072 GR_GL_MIRRORED_REPEAT |
2073 }; | 2073 }; |
2074 GR_STATIC_ASSERT(SkShader::kTileModeCount == SK_ARRAY_COUNT(gWrapModes)); | 2074 GR_STATIC_ASSERT(SkShader::kTileModeCount == SK_ARRAY_COUNT(gWrapModes)); |
2075 GR_STATIC_ASSERT(0 == SkShader::kClamp_TileMode); | 2075 GR_STATIC_ASSERT(0 == SkShader::kClamp_TileMode); |
2076 GR_STATIC_ASSERT(1 == SkShader::kRepeat_TileMode); | 2076 GR_STATIC_ASSERT(1 == SkShader::kRepeat_TileMode); |
2077 GR_STATIC_ASSERT(2 == SkShader::kMirror_TileMode); | 2077 GR_STATIC_ASSERT(2 == SkShader::kMirror_TileMode); |
2078 return gWrapModes[tm]; | 2078 return gWrapModes[tm]; |
2079 } | 2079 } |
2080 | 2080 |
2081 void GrGpuGL::bindTexture(int unitIdx, const GrTextureParams& params, GrGLTextur
e* texture) { | 2081 void GrGLGpu::bindTexture(int unitIdx, const GrTextureParams& params, GrGLTextur
e* texture) { |
2082 SkASSERT(texture); | 2082 SkASSERT(texture); |
2083 | 2083 |
2084 // If we created a rt/tex and rendered to it without using a texture and now
we're texturing | 2084 // If we created a rt/tex and rendered to it without using a texture and now
we're texturing |
2085 // from the rt it will still be the last bound texture, but it needs resolvi
ng. So keep this | 2085 // from the rt it will still be the last bound texture, but it needs resolvi
ng. So keep this |
2086 // out of the "last != next" check. | 2086 // out of the "last != next" check. |
2087 GrGLRenderTarget* texRT = static_cast<GrGLRenderTarget*>(texture->asRenderTa
rget()); | 2087 GrGLRenderTarget* texRT = static_cast<GrGLRenderTarget*>(texture->asRenderTa
rget()); |
2088 if (texRT) { | 2088 if (texRT) { |
2089 this->onResolveRenderTarget(texRT); | 2089 this->onResolveRenderTarget(texRT); |
2090 } | 2090 } |
2091 | 2091 |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2171 GL_CALL(TexParameteri(GR_GL_TEXTURE_2D, GR_GL_TEXTURE_SWIZZLE_A, swi
zzle[3])); | 2171 GL_CALL(TexParameteri(GR_GL_TEXTURE_2D, GR_GL_TEXTURE_SWIZZLE_A, swi
zzle[3])); |
2172 } else { | 2172 } else { |
2173 GR_STATIC_ASSERT(sizeof(newTexParams.fSwizzleRGBA[0]) == sizeof(GrGL
int)); | 2173 GR_STATIC_ASSERT(sizeof(newTexParams.fSwizzleRGBA[0]) == sizeof(GrGL
int)); |
2174 const GrGLint* swizzle = reinterpret_cast<const GrGLint*>(newTexPara
ms.fSwizzleRGBA); | 2174 const GrGLint* swizzle = reinterpret_cast<const GrGLint*>(newTexPara
ms.fSwizzleRGBA); |
2175 GL_CALL(TexParameteriv(GR_GL_TEXTURE_2D, GR_GL_TEXTURE_SWIZZLE_RGBA,
swizzle)); | 2175 GL_CALL(TexParameteriv(GR_GL_TEXTURE_2D, GR_GL_TEXTURE_SWIZZLE_RGBA,
swizzle)); |
2176 } | 2176 } |
2177 } | 2177 } |
2178 texture->setCachedTexParams(newTexParams, this->getResetTimestamp()); | 2178 texture->setCachedTexParams(newTexParams, this->getResetTimestamp()); |
2179 } | 2179 } |
2180 | 2180 |
2181 void GrGpuGL::flushMiscFixedFunctionState(const GrOptDrawState& optState) { | 2181 void GrGLGpu::flushMiscFixedFunctionState(const GrOptDrawState& optState) { |
2182 if (optState.isDitherState()) { | 2182 if (optState.isDitherState()) { |
2183 if (kYes_TriState != fHWDitherEnabled) { | 2183 if (kYes_TriState != fHWDitherEnabled) { |
2184 GL_CALL(Enable(GR_GL_DITHER)); | 2184 GL_CALL(Enable(GR_GL_DITHER)); |
2185 fHWDitherEnabled = kYes_TriState; | 2185 fHWDitherEnabled = kYes_TriState; |
2186 } | 2186 } |
2187 } else { | 2187 } else { |
2188 if (kNo_TriState != fHWDitherEnabled) { | 2188 if (kNo_TriState != fHWDitherEnabled) { |
2189 GL_CALL(Disable(GR_GL_DITHER)); | 2189 GL_CALL(Disable(GR_GL_DITHER)); |
2190 fHWDitherEnabled = kNo_TriState; | 2190 fHWDitherEnabled = kNo_TriState; |
2191 } | 2191 } |
(...skipping 25 matching lines...) Expand all Loading... |
2217 case GrDrawState::kBoth_DrawFace: | 2217 case GrDrawState::kBoth_DrawFace: |
2218 GL_CALL(Disable(GR_GL_CULL_FACE)); | 2218 GL_CALL(Disable(GR_GL_CULL_FACE)); |
2219 break; | 2219 break; |
2220 default: | 2220 default: |
2221 SkFAIL("Unknown draw face."); | 2221 SkFAIL("Unknown draw face."); |
2222 } | 2222 } |
2223 fHWDrawFace = optState.getDrawFace(); | 2223 fHWDrawFace = optState.getDrawFace(); |
2224 } | 2224 } |
2225 } | 2225 } |
2226 | 2226 |
2227 bool GrGpuGL::configToGLFormats(GrPixelConfig config, | 2227 bool GrGLGpu::configToGLFormats(GrPixelConfig config, |
2228 bool getSizedInternalFormat, | 2228 bool getSizedInternalFormat, |
2229 GrGLenum* internalFormat, | 2229 GrGLenum* internalFormat, |
2230 GrGLenum* externalFormat, | 2230 GrGLenum* externalFormat, |
2231 GrGLenum* externalType) { | 2231 GrGLenum* externalType) { |
2232 GrGLenum dontCare; | 2232 GrGLenum dontCare; |
2233 if (NULL == internalFormat) { | 2233 if (NULL == internalFormat) { |
2234 internalFormat = &dontCare; | 2234 internalFormat = &dontCare; |
2235 } | 2235 } |
2236 if (NULL == externalFormat) { | 2236 if (NULL == externalFormat) { |
2237 externalFormat = &dontCare; | 2237 externalFormat = &dontCare; |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2366 *externalType = GR_GL_HALF_FLOAT; | 2366 *externalType = GR_GL_HALF_FLOAT; |
2367 } | 2367 } |
2368 break; | 2368 break; |
2369 | 2369 |
2370 default: | 2370 default: |
2371 return false; | 2371 return false; |
2372 } | 2372 } |
2373 return true; | 2373 return true; |
2374 } | 2374 } |
2375 | 2375 |
2376 void GrGpuGL::setTextureUnit(int unit) { | 2376 void GrGLGpu::setTextureUnit(int unit) { |
2377 SkASSERT(unit >= 0 && unit < fHWBoundTextureUniqueIDs.count()); | 2377 SkASSERT(unit >= 0 && unit < fHWBoundTextureUniqueIDs.count()); |
2378 if (unit != fHWActiveTextureUnitIdx) { | 2378 if (unit != fHWActiveTextureUnitIdx) { |
2379 GL_CALL(ActiveTexture(GR_GL_TEXTURE0 + unit)); | 2379 GL_CALL(ActiveTexture(GR_GL_TEXTURE0 + unit)); |
2380 fHWActiveTextureUnitIdx = unit; | 2380 fHWActiveTextureUnitIdx = unit; |
2381 } | 2381 } |
2382 } | 2382 } |
2383 | 2383 |
2384 void GrGpuGL::setScratchTextureUnit() { | 2384 void GrGLGpu::setScratchTextureUnit() { |
2385 // Bind the last texture unit since it is the least likely to be used by GrG
LProgram. | 2385 // Bind the last texture unit since it is the least likely to be used by GrG
LProgram. |
2386 int lastUnitIdx = fHWBoundTextureUniqueIDs.count() - 1; | 2386 int lastUnitIdx = fHWBoundTextureUniqueIDs.count() - 1; |
2387 if (lastUnitIdx != fHWActiveTextureUnitIdx) { | 2387 if (lastUnitIdx != fHWActiveTextureUnitIdx) { |
2388 GL_CALL(ActiveTexture(GR_GL_TEXTURE0 + lastUnitIdx)); | 2388 GL_CALL(ActiveTexture(GR_GL_TEXTURE0 + lastUnitIdx)); |
2389 fHWActiveTextureUnitIdx = lastUnitIdx; | 2389 fHWActiveTextureUnitIdx = lastUnitIdx; |
2390 } | 2390 } |
2391 // clear out the this field so that if a program does use this unit it will
rebind the correct | 2391 // clear out the this field so that if a program does use this unit it will
rebind the correct |
2392 // texture. | 2392 // texture. |
2393 fHWBoundTextureUniqueIDs[lastUnitIdx] = SK_InvalidUniqueID; | 2393 fHWBoundTextureUniqueIDs[lastUnitIdx] = SK_InvalidUniqueID; |
2394 } | 2394 } |
2395 | 2395 |
2396 namespace { | 2396 namespace { |
2397 // Determines whether glBlitFramebuffer could be used between src and dst. | 2397 // Determines whether glBlitFramebuffer could be used between src and dst. |
2398 inline bool can_blit_framebuffer(const GrSurface* dst, | 2398 inline bool can_blit_framebuffer(const GrSurface* dst, |
2399 const GrSurface* src, | 2399 const GrSurface* src, |
2400 const GrGpuGL* gpu, | 2400 const GrGLGpu* gpu, |
2401 bool* wouldNeedTempFBO = NULL) { | 2401 bool* wouldNeedTempFBO = NULL) { |
2402 if (gpu->glCaps().isConfigRenderable(dst->config(), dst->desc().fSampleCnt >
0) && | 2402 if (gpu->glCaps().isConfigRenderable(dst->config(), dst->desc().fSampleCnt >
0) && |
2403 gpu->glCaps().isConfigRenderable(src->config(), src->desc().fSampleCnt >
0) && | 2403 gpu->glCaps().isConfigRenderable(src->config(), src->desc().fSampleCnt >
0) && |
2404 gpu->glCaps().usesMSAARenderBuffers()) { | 2404 gpu->glCaps().usesMSAARenderBuffers()) { |
2405 // ES3 doesn't allow framebuffer blits when the src has MSAA and the con
figs don't match | 2405 // ES3 doesn't allow framebuffer blits when the src has MSAA and the con
figs don't match |
2406 // or the rects are not the same (not just the same size but have the sa
me edges). | 2406 // or the rects are not the same (not just the same size but have the sa
me edges). |
2407 if (GrGLCaps::kES_3_0_MSFBOType == gpu->glCaps().msFBOType() && | 2407 if (GrGLCaps::kES_3_0_MSFBOType == gpu->glCaps().msFBOType() && |
2408 (src->desc().fSampleCnt > 0 || src->config() != dst->config())) { | 2408 (src->desc().fSampleCnt > 0 || src->config() != dst->config())) { |
2409 return false; | 2409 return false; |
2410 } | 2410 } |
2411 if (wouldNeedTempFBO) { | 2411 if (wouldNeedTempFBO) { |
2412 *wouldNeedTempFBO = NULL == dst->asRenderTarget() || NULL == src->as
RenderTarget(); | 2412 *wouldNeedTempFBO = NULL == dst->asRenderTarget() || NULL == src->as
RenderTarget(); |
2413 } | 2413 } |
2414 return true; | 2414 return true; |
2415 } else { | 2415 } else { |
2416 return false; | 2416 return false; |
2417 } | 2417 } |
2418 } | 2418 } |
2419 | 2419 |
2420 inline bool can_copy_texsubimage(const GrSurface* dst, | 2420 inline bool can_copy_texsubimage(const GrSurface* dst, |
2421 const GrSurface* src, | 2421 const GrSurface* src, |
2422 const GrGpuGL* gpu, | 2422 const GrGLGpu* gpu, |
2423 bool* wouldNeedTempFBO = NULL) { | 2423 bool* wouldNeedTempFBO = NULL) { |
2424 // Table 3.9 of the ES2 spec indicates the supported formats with CopyTexSub
Image | 2424 // Table 3.9 of the ES2 spec indicates the supported formats with CopyTexSub
Image |
2425 // and BGRA isn't in the spec. There doesn't appear to be any extension that
adds it. Perhaps | 2425 // and BGRA isn't in the spec. There doesn't appear to be any extension that
adds it. Perhaps |
2426 // many drivers would allow it to work, but ANGLE does not. | 2426 // many drivers would allow it to work, but ANGLE does not. |
2427 if (kGLES_GrGLStandard == gpu->glStandard() && gpu->glCaps().bgraIsInternalF
ormat() && | 2427 if (kGLES_GrGLStandard == gpu->glStandard() && gpu->glCaps().bgraIsInternalF
ormat() && |
2428 (kBGRA_8888_GrPixelConfig == dst->config() || kBGRA_8888_GrPixelConfig =
= src->config())) { | 2428 (kBGRA_8888_GrPixelConfig == dst->config() || kBGRA_8888_GrPixelConfig =
= src->config())) { |
2429 return false; | 2429 return false; |
2430 } | 2430 } |
2431 const GrGLRenderTarget* dstRT = static_cast<const GrGLRenderTarget*>(dst->as
RenderTarget()); | 2431 const GrGLRenderTarget* dstRT = static_cast<const GrGLRenderTarget*>(dst->as
RenderTarget()); |
2432 // If dst is multisampled (and uses an extension where there is a separate M
SAA renderbuffer) | 2432 // If dst is multisampled (and uses an extension where there is a separate M
SAA renderbuffer) |
(...skipping 17 matching lines...) Expand all Loading... |
2450 return true; | 2450 return true; |
2451 } else { | 2451 } else { |
2452 return false; | 2452 return false; |
2453 } | 2453 } |
2454 } | 2454 } |
2455 | 2455 |
2456 } | 2456 } |
2457 | 2457 |
2458 // If a temporary FBO was created, its non-zero ID is returned. The viewport tha
t the copy rect is | 2458 // If a temporary FBO was created, its non-zero ID is returned. The viewport tha
t the copy rect is |
2459 // relative to is output. | 2459 // relative to is output. |
2460 GrGLuint GrGpuGL::bindSurfaceAsFBO(GrSurface* surface, GrGLenum fboTarget, GrGLI
Rect* viewport) { | 2460 GrGLuint GrGLGpu::bindSurfaceAsFBO(GrSurface* surface, GrGLenum fboTarget, GrGLI
Rect* viewport) { |
2461 GrGLRenderTarget* rt = static_cast<GrGLRenderTarget*>(surface->asRenderTarge
t()); | 2461 GrGLRenderTarget* rt = static_cast<GrGLRenderTarget*>(surface->asRenderTarge
t()); |
2462 GrGLuint tempFBOID; | 2462 GrGLuint tempFBOID; |
2463 if (NULL == rt) { | 2463 if (NULL == rt) { |
2464 SkASSERT(surface->asTexture()); | 2464 SkASSERT(surface->asTexture()); |
2465 GrGLuint texID = static_cast<GrGLTexture*>(surface->asTexture())->textur
eID(); | 2465 GrGLuint texID = static_cast<GrGLTexture*>(surface->asTexture())->textur
eID(); |
2466 GR_GL_CALL(this->glInterface(), GenFramebuffers(1, &tempFBOID)); | 2466 GR_GL_CALL(this->glInterface(), GenFramebuffers(1, &tempFBOID)); |
2467 fGPUStats.incRenderTargetBinds(); | 2467 fGPUStats.incRenderTargetBinds(); |
2468 GR_GL_CALL(this->glInterface(), BindFramebuffer(fboTarget, tempFBOID)); | 2468 GR_GL_CALL(this->glInterface(), BindFramebuffer(fboTarget, tempFBOID)); |
2469 GR_GL_CALL(this->glInterface(), FramebufferTexture2D(fboTarget, | 2469 GR_GL_CALL(this->glInterface(), FramebufferTexture2D(fboTarget, |
2470 GR_GL_COLOR_ATTACHM
ENT0, | 2470 GR_GL_COLOR_ATTACHM
ENT0, |
2471 GR_GL_TEXTURE_2D, | 2471 GR_GL_TEXTURE_2D, |
2472 texID, | 2472 texID, |
2473 0)); | 2473 0)); |
2474 viewport->fLeft = 0; | 2474 viewport->fLeft = 0; |
2475 viewport->fBottom = 0; | 2475 viewport->fBottom = 0; |
2476 viewport->fWidth = surface->width(); | 2476 viewport->fWidth = surface->width(); |
2477 viewport->fHeight = surface->height(); | 2477 viewport->fHeight = surface->height(); |
2478 } else { | 2478 } else { |
2479 tempFBOID = 0; | 2479 tempFBOID = 0; |
2480 fGPUStats.incRenderTargetBinds(); | 2480 fGPUStats.incRenderTargetBinds(); |
2481 GR_GL_CALL(this->glInterface(), BindFramebuffer(fboTarget, rt->renderFBO
ID())); | 2481 GR_GL_CALL(this->glInterface(), BindFramebuffer(fboTarget, rt->renderFBO
ID())); |
2482 *viewport = rt->getViewport(); | 2482 *viewport = rt->getViewport(); |
2483 } | 2483 } |
2484 return tempFBOID; | 2484 return tempFBOID; |
2485 } | 2485 } |
2486 | 2486 |
2487 bool GrGpuGL::initCopySurfaceDstDesc(const GrSurface* src, GrSurfaceDesc* desc)
{ | 2487 bool GrGLGpu::initCopySurfaceDstDesc(const GrSurface* src, GrSurfaceDesc* desc)
{ |
2488 // In here we look for opportunities to use CopyTexSubImage, or fbo blit. If
neither are | 2488 // In here we look for opportunities to use CopyTexSubImage, or fbo blit. If
neither are |
2489 // possible and we return false to fallback to creating a render target dst
for render-to- | 2489 // possible and we return false to fallback to creating a render target dst
for render-to- |
2490 // texture. This code prefers CopyTexSubImage to fbo blit and avoids trigger
ing temporary fbo | 2490 // texture. This code prefers CopyTexSubImage to fbo blit and avoids trigger
ing temporary fbo |
2491 // creation. It isn't clear that avoiding temporary fbo creation is actually
optimal. | 2491 // creation. It isn't clear that avoiding temporary fbo creation is actually
optimal. |
2492 | 2492 |
2493 // Check for format issues with glCopyTexSubImage2D | 2493 // Check for format issues with glCopyTexSubImage2D |
2494 if (kGLES_GrGLStandard == this->glStandard() && this->glCaps().bgraIsInterna
lFormat() && | 2494 if (kGLES_GrGLStandard == this->glStandard() && this->glCaps().bgraIsInterna
lFormat() && |
2495 kBGRA_8888_GrPixelConfig == src->config()) { | 2495 kBGRA_8888_GrPixelConfig == src->config()) { |
2496 // glCopyTexSubImage2D doesn't work with this config. If the bgra can be
used with fbo blit | 2496 // glCopyTexSubImage2D doesn't work with this config. If the bgra can be
used with fbo blit |
2497 // then we set up for that, otherwise fail. | 2497 // then we set up for that, otherwise fail. |
(...skipping 22 matching lines...) Expand all Loading... |
2520 return false; | 2520 return false; |
2521 } | 2521 } |
2522 | 2522 |
2523 // We'll do a CopyTexSubImage. Make the dst a plain old texture. | 2523 // We'll do a CopyTexSubImage. Make the dst a plain old texture. |
2524 desc->fConfig = src->config(); | 2524 desc->fConfig = src->config(); |
2525 desc->fOrigin = src->origin(); | 2525 desc->fOrigin = src->origin(); |
2526 desc->fFlags = kNone_GrSurfaceFlags; | 2526 desc->fFlags = kNone_GrSurfaceFlags; |
2527 return true; | 2527 return true; |
2528 } | 2528 } |
2529 | 2529 |
2530 bool GrGpuGL::copySurface(GrSurface* dst, | 2530 bool GrGLGpu::copySurface(GrSurface* dst, |
2531 GrSurface* src, | 2531 GrSurface* src, |
2532 const SkIRect& srcRect, | 2532 const SkIRect& srcRect, |
2533 const SkIPoint& dstPoint) { | 2533 const SkIPoint& dstPoint) { |
2534 bool copied = false; | 2534 bool copied = false; |
2535 if (can_copy_texsubimage(dst, src, this)) { | 2535 if (can_copy_texsubimage(dst, src, this)) { |
2536 GrGLuint srcFBO; | 2536 GrGLuint srcFBO; |
2537 GrGLIRect srcVP; | 2537 GrGLIRect srcVP; |
2538 srcFBO = this->bindSurfaceAsFBO(src, GR_GL_FRAMEBUFFER, &srcVP); | 2538 srcFBO = this->bindSurfaceAsFBO(src, GR_GL_FRAMEBUFFER, &srcVP); |
2539 GrGLTexture* dstTex = static_cast<GrGLTexture*>(dst->asTexture()); | 2539 GrGLTexture* dstTex = static_cast<GrGLTexture*>(dst->asTexture()); |
2540 SkASSERT(dstTex); | 2540 SkASSERT(dstTex); |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2623 } | 2623 } |
2624 if (srcFBO) { | 2624 if (srcFBO) { |
2625 GL_CALL(DeleteFramebuffers(1, &srcFBO)); | 2625 GL_CALL(DeleteFramebuffers(1, &srcFBO)); |
2626 } | 2626 } |
2627 copied = true; | 2627 copied = true; |
2628 } | 2628 } |
2629 } | 2629 } |
2630 return copied; | 2630 return copied; |
2631 } | 2631 } |
2632 | 2632 |
2633 bool GrGpuGL::canCopySurface(const GrSurface* dst, | 2633 bool GrGLGpu::canCopySurface(const GrSurface* dst, |
2634 const GrSurface* src, | 2634 const GrSurface* src, |
2635 const SkIRect& srcRect, | 2635 const SkIRect& srcRect, |
2636 const SkIPoint& dstPoint) { | 2636 const SkIPoint& dstPoint) { |
2637 // This mirrors the logic in onCopySurface. We prefer our base makes the co
py if we need to | 2637 // This mirrors the logic in onCopySurface. We prefer our base makes the co
py if we need to |
2638 // create a temp fbo. TODO verify the assumption that temp fbos are expensiv
e; it may not be | 2638 // create a temp fbo. TODO verify the assumption that temp fbos are expensiv
e; it may not be |
2639 // true at all. | 2639 // true at all. |
2640 bool wouldNeedTempFBO = false; | 2640 bool wouldNeedTempFBO = false; |
2641 if (can_copy_texsubimage(dst, src, this, &wouldNeedTempFBO) && !wouldNeedTem
pFBO) { | 2641 if (can_copy_texsubimage(dst, src, this, &wouldNeedTempFBO) && !wouldNeedTem
pFBO) { |
2642 return true; | 2642 return true; |
2643 } | 2643 } |
2644 if (can_blit_framebuffer(dst, src, this, &wouldNeedTempFBO) && !wouldNeedTem
pFBO) { | 2644 if (can_blit_framebuffer(dst, src, this, &wouldNeedTempFBO) && !wouldNeedTem
pFBO) { |
2645 if (dst == src) { | 2645 if (dst == src) { |
2646 SkIRect dstRect = SkIRect::MakeXYWH(dstPoint.fX, dstPoint.fY, | 2646 SkIRect dstRect = SkIRect::MakeXYWH(dstPoint.fX, dstPoint.fY, |
2647 srcRect.width(), srcRect.height(
)); | 2647 srcRect.width(), srcRect.height(
)); |
2648 if(!SkIRect::IntersectsNoEmptyCheck(dstRect, srcRect)) { | 2648 if(!SkIRect::IntersectsNoEmptyCheck(dstRect, srcRect)) { |
2649 return true; | 2649 return true; |
2650 } | 2650 } |
2651 } else { | 2651 } else { |
2652 return true; | 2652 return true; |
2653 } | 2653 } |
2654 } | 2654 } |
2655 return false; | 2655 return false; |
2656 } | 2656 } |
2657 | 2657 |
2658 void GrGpuGL::didAddGpuTraceMarker() { | 2658 void GrGLGpu::didAddGpuTraceMarker() { |
2659 if (this->caps()->gpuTracingSupport()) { | 2659 if (this->caps()->gpuTracingSupport()) { |
2660 const GrTraceMarkerSet& markerArray = this->getActiveTraceMarkers(); | 2660 const GrTraceMarkerSet& markerArray = this->getActiveTraceMarkers(); |
2661 SkString markerString = markerArray.toStringLast(); | 2661 SkString markerString = markerArray.toStringLast(); |
2662 GL_CALL(PushGroupMarker(0, markerString.c_str())); | 2662 GL_CALL(PushGroupMarker(0, markerString.c_str())); |
2663 } | 2663 } |
2664 } | 2664 } |
2665 | 2665 |
2666 void GrGpuGL::didRemoveGpuTraceMarker() { | 2666 void GrGLGpu::didRemoveGpuTraceMarker() { |
2667 if (this->caps()->gpuTracingSupport()) { | 2667 if (this->caps()->gpuTracingSupport()) { |
2668 GL_CALL(PopGroupMarker()); | 2668 GL_CALL(PopGroupMarker()); |
2669 } | 2669 } |
2670 } | 2670 } |
2671 | 2671 |
2672 /////////////////////////////////////////////////////////////////////////////// | 2672 /////////////////////////////////////////////////////////////////////////////// |
2673 | 2673 |
2674 GrGLAttribArrayState* GrGpuGL::HWGeometryState::bindArrayAndBuffersToDraw( | 2674 GrGLAttribArrayState* GrGLGpu::HWGeometryState::bindArrayAndBuffersToDraw( |
2675 GrGpuGL* gpu, | 2675 GrGLGpu* gpu, |
2676 const GrGLVertexBuffer* vbuffer, | 2676 const GrGLVertexBuffer* vbuffer, |
2677 const GrGLIndexBuffer* ibuffer)
{ | 2677 const GrGLIndexBuffer* ibuffer)
{ |
2678 SkASSERT(vbuffer); | 2678 SkASSERT(vbuffer); |
2679 GrGLAttribArrayState* attribState; | 2679 GrGLAttribArrayState* attribState; |
2680 | 2680 |
2681 // We use a vertex array if we're on a core profile and the verts are in a V
BO. | 2681 // We use a vertex array if we're on a core profile and the verts are in a V
BO. |
2682 if (gpu->glCaps().isCoreProfile() && !vbuffer->isCPUBacked()) { | 2682 if (gpu->glCaps().isCoreProfile() && !vbuffer->isCPUBacked()) { |
2683 if (NULL == fVBOVertexArray || fVBOVertexArray->wasDestroyed()) { | 2683 if (NULL == fVBOVertexArray || fVBOVertexArray->wasDestroyed()) { |
2684 SkSafeUnref(fVBOVertexArray); | 2684 SkSafeUnref(fVBOVertexArray); |
2685 GrGLuint arrayID; | 2685 GrGLuint arrayID; |
2686 GR_GL_CALL(gpu->glInterface(), GenVertexArrays(1, &arrayID)); | 2686 GR_GL_CALL(gpu->glInterface(), GenVertexArrays(1, &arrayID)); |
2687 int attrCount = gpu->glCaps().maxVertexAttributes(); | 2687 int attrCount = gpu->glCaps().maxVertexAttributes(); |
2688 fVBOVertexArray = SkNEW_ARGS(GrGLVertexArray, (gpu, arrayID, attrCou
nt)); | 2688 fVBOVertexArray = SkNEW_ARGS(GrGLVertexArray, (gpu, arrayID, attrCou
nt)); |
2689 } | 2689 } |
2690 attribState = fVBOVertexArray->bindWithIndexBuffer(ibuffer); | 2690 attribState = fVBOVertexArray->bindWithIndexBuffer(ibuffer); |
2691 } else { | 2691 } else { |
2692 if (ibuffer) { | 2692 if (ibuffer) { |
2693 this->setIndexBufferIDOnDefaultVertexArray(gpu, ibuffer->bufferID())
; | 2693 this->setIndexBufferIDOnDefaultVertexArray(gpu, ibuffer->bufferID())
; |
2694 } else { | 2694 } else { |
2695 this->setVertexArrayID(gpu, 0); | 2695 this->setVertexArrayID(gpu, 0); |
2696 } | 2696 } |
2697 int attrCount = gpu->glCaps().maxVertexAttributes(); | 2697 int attrCount = gpu->glCaps().maxVertexAttributes(); |
2698 if (fDefaultVertexArrayAttribState.count() != attrCount) { | 2698 if (fDefaultVertexArrayAttribState.count() != attrCount) { |
2699 fDefaultVertexArrayAttribState.resize(attrCount); | 2699 fDefaultVertexArrayAttribState.resize(attrCount); |
2700 } | 2700 } |
2701 attribState = &fDefaultVertexArrayAttribState; | 2701 attribState = &fDefaultVertexArrayAttribState; |
2702 } | 2702 } |
2703 return attribState; | 2703 return attribState; |
2704 } | 2704 } |
OLD | NEW |