| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2013 Google Inc. | 2 * Copyright 2013 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #ifndef GrGeometryProcessor_DEFINED | 8 #ifndef GrPrimitiveProcessor_DEFINED |
| 9 #define GrGeometryProcessor_DEFINED | 9 #define GrPrimitiveProcessor_DEFINED |
| 10 | 10 |
| 11 #include "GrColor.h" | 11 #include "GrColor.h" |
| 12 #include "GrProcessor.h" | 12 #include "GrProcessor.h" |
| 13 #include "GrShaderVar.h" | 13 #include "GrShaderVar.h" |
| 14 | 14 |
| 15 /* | 15 /* |
| 16 * The GrPrimitiveProcessor represents some kind of geometric primitive. This i
ncludes the shape | 16 * The GrPrimitiveProcessor represents some kind of geometric primitive. This i
ncludes the shape |
| 17 * of the primitive and the inherent color of the primitive. The GrPrimitivePro
cessor is | 17 * of the primitive and the inherent color of the primitive. The GrPrimitivePro
cessor is |
| 18 * responsible for providing a color and coverage input into the Ganesh renderin
g pipeline. Through | 18 * responsible for providing a color and coverage input into the Ganesh renderin
g pipeline. Through |
| 19 * optimization, Ganesh may decide a different color, no color, and / or no cove
rage are required | 19 * optimization, Ganesh may decide a different color, no color, and / or no cove
rage are required |
| (...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 220 private: | 220 private: |
| 221 virtual bool hasExplicitLocalCoords() const = 0; | 221 virtual bool hasExplicitLocalCoords() const = 0; |
| 222 | 222 |
| 223 const SkMatrix fViewMatrix; | 223 const SkMatrix fViewMatrix; |
| 224 SkMatrix fLocalMatrix; | 224 SkMatrix fLocalMatrix; |
| 225 bool fIsPathRendering; | 225 bool fIsPathRendering; |
| 226 | 226 |
| 227 typedef GrProcessor INHERITED; | 227 typedef GrProcessor INHERITED; |
| 228 }; | 228 }; |
| 229 | 229 |
| 230 /** | |
| 231 * A GrGeometryProcessor is a flexible method for rendering a primitive. The Gr
GeometryProcessor | |
| 232 * has complete control over vertex attributes and uniforms(aside from the rende
r target) but it | |
| 233 * must obey the same contract as any GrPrimitiveProcessor, specifically it must
emit a color and | |
| 234 * coverage into the fragment shader. Where this color and coverage come from i
s completely the | |
| 235 * responsibility of the GrGeometryProcessor. | |
| 236 */ | |
| 237 class GrGeometryProcessor : public GrPrimitiveProcessor { | |
| 238 public: | |
| 239 // TODO the Hint can be handled in a much more clean way when we have deferr
ed geometry or | |
| 240 // atleast bundles | |
| 241 GrGeometryProcessor(GrColor color, | |
| 242 const SkMatrix& viewMatrix = SkMatrix::I(), | |
| 243 const SkMatrix& localMatrix = SkMatrix::I(), | |
| 244 bool opaqueVertexColors = false) | |
| 245 : INHERITED(viewMatrix, localMatrix, false) | |
| 246 , fColor(color) | |
| 247 , fOpaqueVertexColors(opaqueVertexColors) | |
| 248 , fWillUseGeoShader(false) | |
| 249 , fHasVertexColor(false) | |
| 250 , fHasLocalCoords(false) {} | |
| 251 | |
| 252 bool willUseGeoShader() const { return fWillUseGeoShader; } | |
| 253 | |
| 254 /* | |
| 255 * In an ideal world, two GrGeometryProcessors with the same class id and te
xture accesses | |
| 256 * would ALWAYS be able to batch together. If two GrGeometryProcesosrs are
the same then we | |
| 257 * will only keep one of them. The remaining GrGeometryProcessor then updat
es its | |
| 258 * GrBatchTracker to incorporate the draw information from the GrGeometryPro
cessor we discard. | |
| 259 * Any bundles associated with the discarded GrGeometryProcessor will be att
ached to the | |
| 260 * remaining GrGeometryProcessor. | |
| 261 */ | |
| 262 bool canMakeEqual(const GrBatchTracker& mine, | |
| 263 const GrPrimitiveProcessor& that, | |
| 264 const GrBatchTracker& theirs) const SK_OVERRIDE { | |
| 265 if (this->classID() != that.classID() || !this->hasSameTextureAccesses(t
hat)) { | |
| 266 return false; | |
| 267 } | |
| 268 | |
| 269 // TODO let the GPs decide this | |
| 270 if (!this->viewMatrix().cheapEqualTo(that.viewMatrix())) { | |
| 271 return false; | |
| 272 } | |
| 273 | |
| 274 // TODO remove the hint | |
| 275 const GrGeometryProcessor& other = that.cast<GrGeometryProcessor>(); | |
| 276 if (fHasVertexColor && fOpaqueVertexColors != other.fOpaqueVertexColors)
{ | |
| 277 return false; | |
| 278 } | |
| 279 | |
| 280 // TODO this equality test should really be broken up, some of this can
live on the batch | |
| 281 // tracker test and some of this should be in bundles | |
| 282 if (!this->onIsEqual(other)) { | |
| 283 return false; | |
| 284 } | |
| 285 | |
| 286 return this->onCanMakeEqual(mine, other, theirs); | |
| 287 } | |
| 288 | |
| 289 // TODO we can remove color from the GrGeometryProcessor base class once we
have bundles of | |
| 290 // primitive data | |
| 291 GrColor color() const { return fColor; } | |
| 292 | |
| 293 // TODO this is a total hack until the gp can do deferred geometry | |
| 294 bool hasVertexColor() const { return fHasVertexColor; } | |
| 295 | |
| 296 void getInvariantOutputColor(GrInitInvariantOutput* out) const SK_OVERRIDE; | |
| 297 void getInvariantOutputCoverage(GrInitInvariantOutput* out) const SK_OVERRID
E; | |
| 298 | |
| 299 protected: | |
| 300 /* | |
| 301 * An optional simple helper function to determine by what means the GrGeome
tryProcessor should | |
| 302 * use to provide color. If we are given an override color(ie the given ove
rridecolor is NOT | |
| 303 * GrColor_ILLEGAL) then we must always emit that color(currently overrides
are only supported | |
| 304 * via uniform, but with deferred Geometry we could use attributes). Otherw
ise, if our color is | |
| 305 * ignored then we should not emit a color. Lastly, if we don't have vertex
colors then we must | |
| 306 * emit a color via uniform | |
| 307 * TODO this function changes quite a bit with deferred geometry. There the
GrGeometryProcessor | |
| 308 * can upload a new color via attribute if needed. | |
| 309 */ | |
| 310 static GrGPInput GetColorInputType(GrColor* color, GrColor primitiveColor, | |
| 311 const GrPipelineInfo& init, | |
| 312 bool hasVertexColor) { | |
| 313 if (init.fColorIgnored) { | |
| 314 *color = GrColor_ILLEGAL; | |
| 315 return kIgnored_GrGPInput; | |
| 316 } else if (GrColor_ILLEGAL != init.fOverrideColor) { | |
| 317 *color = init.fOverrideColor; | |
| 318 return kUniform_GrGPInput; | |
| 319 } | |
| 320 | |
| 321 *color = primitiveColor; | |
| 322 if (hasVertexColor) { | |
| 323 return kAttribute_GrGPInput; | |
| 324 } else { | |
| 325 return kUniform_GrGPInput; | |
| 326 } | |
| 327 } | |
| 328 | |
| 329 /** | |
| 330 * Subclasses call this from their constructor to register vertex attributes
. Attributes | |
| 331 * will be padded to the nearest 4 bytes for performance reasons. | |
| 332 * TODO After deferred geometry, we should do all of this inline in Generate
Geometry alongside | |
| 333 * the struct used to actually populate the attributes. This is all extreme
ly fragile, vertex | |
| 334 * attributes have to be added in the order they will appear in the struct w
hich maps memory. | |
| 335 * The processor key should reflect the vertex attributes, or there lack the
reof in the | |
| 336 * GrGeometryProcessor. | |
| 337 */ | |
| 338 const Attribute& addVertexAttrib(const Attribute& attribute) { | |
| 339 SkASSERT(fNumAttribs < kMaxVertexAttribs); | |
| 340 fVertexStride += attribute.fOffset; | |
| 341 fAttribs[fNumAttribs] = attribute; | |
| 342 return fAttribs[fNumAttribs++]; | |
| 343 } | |
| 344 | |
| 345 void setWillUseGeoShader() { fWillUseGeoShader = true; } | |
| 346 | |
| 347 // TODO hack see above | |
| 348 void setHasVertexColor() { fHasVertexColor = true; } | |
| 349 void setHasLocalCoords() { fHasLocalCoords = true; } | |
| 350 | |
| 351 virtual void onGetInvariantOutputColor(GrInitInvariantOutput*) const {} | |
| 352 virtual void onGetInvariantOutputCoverage(GrInitInvariantOutput*) const = 0; | |
| 353 | |
| 354 private: | |
| 355 virtual bool onCanMakeEqual(const GrBatchTracker& mine, | |
| 356 const GrGeometryProcessor& that, | |
| 357 const GrBatchTracker& theirs) const = 0; | |
| 358 | |
| 359 // TODO delete this when we have more advanced equality testing via bundles
and the BT | |
| 360 virtual bool onIsEqual(const GrGeometryProcessor&) const = 0; | |
| 361 | |
| 362 bool hasExplicitLocalCoords() const SK_OVERRIDE { return fHasLocalCoords; } | |
| 363 | |
| 364 GrColor fColor; | |
| 365 bool fOpaqueVertexColors; | |
| 366 bool fWillUseGeoShader; | |
| 367 bool fHasVertexColor; | |
| 368 bool fHasLocalCoords; | |
| 369 | |
| 370 typedef GrPrimitiveProcessor INHERITED; | |
| 371 }; | |
| 372 | |
| 373 /* | |
| 374 * The path equivalent of the GP. For now this just manages color. In the long
term we plan on | |
| 375 * extending this class to handle all nvpr uniform / varying / program work. | |
| 376 */ | |
| 377 class GrPathProcessor : public GrPrimitiveProcessor { | |
| 378 public: | |
| 379 static GrPathProcessor* Create(GrColor color, | |
| 380 const SkMatrix& viewMatrix = SkMatrix::I(), | |
| 381 const SkMatrix& localMatrix = SkMatrix::I())
{ | |
| 382 return SkNEW_ARGS(GrPathProcessor, (color, viewMatrix, localMatrix)); | |
| 383 } | |
| 384 | |
| 385 void initBatchTracker(GrBatchTracker*, const GrPipelineInfo&) const SK_OVERR
IDE; | |
| 386 | |
| 387 bool canMakeEqual(const GrBatchTracker& mine, | |
| 388 const GrPrimitiveProcessor& that, | |
| 389 const GrBatchTracker& theirs) const SK_OVERRIDE; | |
| 390 | |
| 391 const char* name() const SK_OVERRIDE { return "PathProcessor"; } | |
| 392 | |
| 393 GrColor color() const { return fColor; } | |
| 394 | |
| 395 void getInvariantOutputColor(GrInitInvariantOutput* out) const SK_OVERRIDE; | |
| 396 void getInvariantOutputCoverage(GrInitInvariantOutput* out) const SK_OVERRID
E; | |
| 397 | |
| 398 bool willUseGeoShader() const SK_OVERRIDE { return false; } | |
| 399 | |
| 400 virtual void getGLProcessorKey(const GrBatchTracker& bt, | |
| 401 const GrGLCaps& caps, | |
| 402 GrProcessorKeyBuilder* b) const SK_OVERRIDE; | |
| 403 | |
| 404 virtual GrGLPrimitiveProcessor* createGLInstance(const GrBatchTracker& bt, | |
| 405 const GrGLCaps& caps) const
SK_OVERRIDE; | |
| 406 | |
| 407 protected: | |
| 408 GrPathProcessor(GrColor color, const SkMatrix& viewMatrix, const SkMatrix& l
ocalMatrix); | |
| 409 | |
| 410 private: | |
| 411 bool hasExplicitLocalCoords() const SK_OVERRIDE { return false; } | |
| 412 | |
| 413 GrColor fColor; | |
| 414 | |
| 415 typedef GrPrimitiveProcessor INHERITED; | |
| 416 }; | |
| 417 | |
| 418 #endif | 230 #endif |
| OLD | NEW |