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 #include "GrGpuGL.h" | 8 #include "GrGpuGL.h" |
9 | 9 |
10 #include "builders/GrGLProgramBuilder.h" | 10 #include "builders/GrGLProgramBuilder.h" |
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
194 } | 194 } |
195 } | 195 } |
196 ++fCurrLRUStamp; | 196 ++fCurrLRUStamp; |
197 return entry->fProgram; | 197 return entry->fProgram; |
198 } | 198 } |
199 | 199 |
200 //////////////////////////////////////////////////////////////////////////////// | 200 //////////////////////////////////////////////////////////////////////////////// |
201 | 201 |
202 #define GL_CALL(X) GR_GL_CALL(this->glInterface(), X) | 202 #define GL_CALL(X) GR_GL_CALL(this->glInterface(), X) |
203 | 203 |
204 bool GrGpuGL::flushGraphicsState(DrawType type, | 204 bool GrGpuGL::flushGraphicsState(const GrOptDrawState& optState, |
| 205 DrawType type, |
205 const GrClipMaskManager::ScissorState& scissorS
tate, | 206 const GrClipMaskManager::ScissorState& scissorS
tate, |
206 const GrDeviceCoordTexture* dstCopy) { | 207 const GrDeviceCoordTexture* dstCopy) { |
207 SkAutoTUnref<GrOptDrawState> optState(GrOptDrawState::Create(this->getDrawSt
ate(), | |
208 this, | |
209 dstCopy, | |
210 type)); | |
211 | |
212 if (!optState) { | |
213 return false; | |
214 } | |
215 | |
216 // GrGpu::setupClipAndFlushState should have already checked this and bailed
if not true. | 208 // GrGpu::setupClipAndFlushState should have already checked this and bailed
if not true. |
217 SkASSERT(optState->getRenderTarget()); | 209 SkASSERT(optState.getRenderTarget()); |
218 | 210 |
219 if (kStencilPath_DrawType == type) { | 211 if (kStencilPath_DrawType == type) { |
220 const GrRenderTarget* rt = optState->getRenderTarget(); | 212 const GrRenderTarget* rt = optState.getRenderTarget(); |
221 SkISize size; | 213 SkISize size; |
222 size.set(rt->width(), rt->height()); | 214 size.set(rt->width(), rt->height()); |
223 this->glPathRendering()->setProjectionMatrix(optState->getViewMatrix(),
size, rt->origin()); | 215 this->glPathRendering()->setProjectionMatrix(optState.getViewMatrix(), s
ize, rt->origin()); |
224 } else { | 216 } else { |
225 this->flushMiscFixedFunctionState(*optState.get()); | 217 this->flushMiscFixedFunctionState(optState); |
226 | 218 |
227 GrBlendCoeff srcCoeff = optState->getSrcBlendCoeff(); | 219 GrBlendCoeff srcCoeff = optState.getSrcBlendCoeff(); |
228 GrBlendCoeff dstCoeff = optState->getDstBlendCoeff(); | 220 GrBlendCoeff dstCoeff = optState.getDstBlendCoeff(); |
229 | 221 |
230 // In these blend coeff's we end up drawing nothing so we can skip draw
all together | 222 // In these blend coeff's we end up drawing nothing so we can skip draw
all together |
231 if (kZero_GrBlendCoeff == srcCoeff && kOne_GrBlendCoeff == dstCoeff && | 223 if (kZero_GrBlendCoeff == srcCoeff && kOne_GrBlendCoeff == dstCoeff && |
232 !optState->getStencil().doesWrite()) { | 224 !optState.getStencil().doesWrite()) { |
233 return false; | 225 return false; |
234 } | 226 } |
235 | 227 |
236 fCurrentProgram.reset(fProgramCache->getProgram(*optState.get(), type)); | 228 fCurrentProgram.reset(fProgramCache->getProgram(optState, type)); |
237 if (NULL == fCurrentProgram.get()) { | 229 if (NULL == fCurrentProgram.get()) { |
238 SkDEBUGFAIL("Failed to create program!"); | 230 SkDEBUGFAIL("Failed to create program!"); |
239 return false; | 231 return false; |
240 } | 232 } |
241 | 233 |
242 fCurrentProgram.get()->ref(); | 234 fCurrentProgram.get()->ref(); |
243 | 235 |
244 GrGLuint programID = fCurrentProgram->programID(); | 236 GrGLuint programID = fCurrentProgram->programID(); |
245 if (fHWProgramID != programID) { | 237 if (fHWProgramID != programID) { |
246 GL_CALL(UseProgram(programID)); | 238 GL_CALL(UseProgram(programID)); |
247 fHWProgramID = programID; | 239 fHWProgramID = programID; |
248 } | 240 } |
249 | 241 |
250 this->flushBlend(*optState.get(), kDrawLines_DrawType == type, srcCoeff,
dstCoeff); | 242 this->flushBlend(optState, kDrawLines_DrawType == type, srcCoeff, dstCoe
ff); |
251 | 243 |
252 fCurrentProgram->setData(*optState.get(), type, dstCopy); | 244 fCurrentProgram->setData(optState, type, dstCopy); |
253 } | 245 } |
254 | 246 |
255 GrGLRenderTarget* glRT = static_cast<GrGLRenderTarget*>(optState->getRenderT
arget()); | 247 GrGLRenderTarget* glRT = static_cast<GrGLRenderTarget*>(optState.getRenderTa
rget()); |
256 this->flushStencil(optState->getStencil(), type); | 248 this->flushStencil(optState.getStencil(), type); |
257 this->flushScissor(scissorState, glRT->getViewport(), glRT->origin()); | 249 this->flushScissor(scissorState, glRT->getViewport(), glRT->origin()); |
258 this->flushAAState(*optState.get(), type); | 250 this->flushAAState(optState, type); |
259 | 251 |
260 // This must come after textures are flushed because a texture may need | 252 // This must come after textures are flushed because a texture may need |
261 // to be msaa-resolved (which will modify bound FBO state). | 253 // to be msaa-resolved (which will modify bound FBO state). |
262 this->flushRenderTarget(glRT, NULL); | 254 this->flushRenderTarget(glRT, NULL); |
263 | 255 |
264 return true; | 256 return true; |
265 } | 257 } |
266 | 258 |
267 void GrGpuGL::setupGeometry(const GrDrawTarget::DrawInfo& info, size_t* indexOff
setInBytes) { | 259 void GrGpuGL::setupGeometry(const GrOptDrawState& optState, |
268 SkAutoTUnref<GrOptDrawState> optState( | 260 const GrDrawTarget::DrawInfo& info, |
269 GrOptDrawState::Create(this->getDrawState(), this, info.getDstCopy(), | 261 size_t* indexOffsetInBytes) { |
270 PrimTypeToDrawType(info.primitiveType()))); | 262 GrGLsizei stride = static_cast<GrGLsizei>(optState.getVertexStride()); |
271 | |
272 // If the optState would is NULL it should have been caught in flushGraphics
State before getting | |
273 // here. | |
274 SkASSERT(optState); | |
275 | |
276 GrGLsizei stride = static_cast<GrGLsizei>(optState->getVertexStride()); | |
277 | 263 |
278 size_t vertexOffsetInBytes = stride * info.startVertex(); | 264 size_t vertexOffsetInBytes = stride * info.startVertex(); |
279 | 265 |
280 GrGLVertexBuffer* vbuf; | 266 GrGLVertexBuffer* vbuf; |
281 vbuf = (GrGLVertexBuffer*) this->getGeomSrc().fVertexBuffer; | 267 vbuf = (GrGLVertexBuffer*) this->getGeomSrc().fVertexBuffer; |
282 | 268 |
283 SkASSERT(vbuf); | 269 SkASSERT(vbuf); |
284 SkASSERT(!vbuf->isMapped()); | 270 SkASSERT(!vbuf->isMapped()); |
285 vertexOffsetInBytes += vbuf->baseOffset(); | 271 vertexOffsetInBytes += vbuf->baseOffset(); |
286 | 272 |
287 GrGLIndexBuffer* ibuf = NULL; | 273 GrGLIndexBuffer* ibuf = NULL; |
288 if (info.isIndexed()) { | 274 if (info.isIndexed()) { |
289 SkASSERT(indexOffsetInBytes); | 275 SkASSERT(indexOffsetInBytes); |
290 | 276 |
291 *indexOffsetInBytes = 0; | 277 *indexOffsetInBytes = 0; |
292 ibuf = (GrGLIndexBuffer*)this->getGeomSrc().fIndexBuffer; | 278 ibuf = (GrGLIndexBuffer*)this->getGeomSrc().fIndexBuffer; |
293 | 279 |
294 SkASSERT(ibuf); | 280 SkASSERT(ibuf); |
295 SkASSERT(!ibuf->isMapped()); | 281 SkASSERT(!ibuf->isMapped()); |
296 *indexOffsetInBytes += ibuf->baseOffset(); | 282 *indexOffsetInBytes += ibuf->baseOffset(); |
297 } | 283 } |
298 GrGLAttribArrayState* attribState = | 284 GrGLAttribArrayState* attribState = |
299 fHWGeometryState.bindArrayAndBuffersToDraw(this, vbuf, ibuf); | 285 fHWGeometryState.bindArrayAndBuffersToDraw(this, vbuf, ibuf); |
300 | 286 |
301 if (fCurrentProgram->hasVertexShader()) { | 287 if (fCurrentProgram->hasVertexShader()) { |
302 int vertexAttribCount = optState->getVertexAttribCount(); | 288 int vertexAttribCount = optState.getVertexAttribCount(); |
303 uint32_t usedAttribArraysMask = 0; | 289 uint32_t usedAttribArraysMask = 0; |
304 const GrVertexAttrib* vertexAttrib = optState->getVertexAttribs(); | 290 const GrVertexAttrib* vertexAttrib = optState.getVertexAttribs(); |
305 | 291 |
306 for (int vertexAttribIndex = 0; vertexAttribIndex < vertexAttribCount; | 292 for (int vertexAttribIndex = 0; vertexAttribIndex < vertexAttribCount; |
307 ++vertexAttribIndex, ++vertexAttrib) { | 293 ++vertexAttribIndex, ++vertexAttrib) { |
308 usedAttribArraysMask |= (1 << vertexAttribIndex); | 294 usedAttribArraysMask |= (1 << vertexAttribIndex); |
309 GrVertexAttribType attribType = vertexAttrib->fType; | 295 GrVertexAttribType attribType = vertexAttrib->fType; |
310 attribState->set(this, | 296 attribState->set(this, |
311 vertexAttribIndex, | 297 vertexAttribIndex, |
312 vbuf, | 298 vbuf, |
313 GrGLAttribTypeToLayout(attribType).fCount, | 299 GrGLAttribTypeToLayout(attribType).fCount, |
314 GrGLAttribTypeToLayout(attribType).fType, | 300 GrGLAttribTypeToLayout(attribType).fType, |
315 GrGLAttribTypeToLayout(attribType).fNormalized, | 301 GrGLAttribTypeToLayout(attribType).fNormalized, |
316 stride, | 302 stride, |
317 reinterpret_cast<GrGLvoid*>( | 303 reinterpret_cast<GrGLvoid*>( |
318 vertexOffsetInBytes + vertexAttrib->fOffset)); | 304 vertexOffsetInBytes + vertexAttrib->fOffset)); |
319 } | 305 } |
320 attribState->disableUnusedArrays(this, usedAttribArraysMask); | 306 attribState->disableUnusedArrays(this, usedAttribArraysMask); |
321 } | 307 } |
322 } | 308 } |
323 | 309 |
324 void GrGpuGL::buildProgramDesc(const GrOptDrawState& optState, | 310 void GrGpuGL::buildProgramDesc(const GrOptDrawState& optState, |
325 const GrProgramDesc::DescInfo& descInfo, | 311 const GrProgramDesc::DescInfo& descInfo, |
326 GrGpu::DrawType drawType, | 312 GrGpu::DrawType drawType, |
327 const GrDeviceCoordTexture* dstCopy, | 313 const GrDeviceCoordTexture* dstCopy, |
328 GrProgramDesc* desc) { | 314 GrProgramDesc* desc) { |
329 if (!GrGLProgramDescBuilder::Build(optState, descInfo, drawType, this, dstCo
py, desc)) { | 315 if (!GrGLProgramDescBuilder::Build(optState, descInfo, drawType, this, dstCo
py, desc)) { |
330 SkDEBUGFAIL("Failed to generate GL program descriptor"); | 316 SkDEBUGFAIL("Failed to generate GL program descriptor"); |
331 } | 317 } |
332 } | 318 } |
OLD | NEW |