| egdaniel | c230414 | 2014-12-11 13:15:13 -0800 | [diff] [blame] | 1 | /* | 
| egdaniel | fa4cc8b | 2015-11-13 08:34:52 -0800 | [diff] [blame] | 2 |  * Copyright 2015 Google Inc. | 
| egdaniel | c230414 | 2014-12-11 13:15:13 -0800 | [diff] [blame] | 3 |  * | 
 | 4 |  * Use of this source code is governed by a BSD-style license that can be | 
 | 5 |  * found in the LICENSE file. | 
 | 6 |  */ | 
 | 7 |  | 
| egdaniel | fa4cc8b | 2015-11-13 08:34:52 -0800 | [diff] [blame] | 8 | #ifndef GrGLSLXferProcessor_DEFINED | 
 | 9 | #define GrGLSLXferProcessor_DEFINED | 
| egdaniel | c230414 | 2014-12-11 13:15:13 -0800 | [diff] [blame] | 10 |  | 
| Brian Salomon | 18dfa98 | 2017-04-03 16:57:43 -0400 | [diff] [blame] | 11 | #include "SkPoint.h" | 
| egdaniel | 018fb62 | 2015-10-28 07:26:40 -0700 | [diff] [blame] | 12 | #include "glsl/GrGLSLProgramDataManager.h" | 
| Brian Salomon | f9f4512 | 2016-11-29 11:59:17 -0500 | [diff] [blame] | 13 | #include "glsl/GrGLSLUniformHandler.h" | 
| egdaniel | c230414 | 2014-12-11 13:15:13 -0800 | [diff] [blame] | 14 |  | 
| bsalomon | 50785a3 | 2015-02-06 07:02:37 -0800 | [diff] [blame] | 15 | class GrXferProcessor; | 
| egdaniel | a2e3e0f | 2015-11-19 07:23:45 -0800 | [diff] [blame] | 16 | class GrGLSLXPBuilder; | 
 | 17 | class GrGLSLXPFragmentBuilder; | 
| Brian Salomon | 94efbf5 | 2016-11-29 13:43:05 -0500 | [diff] [blame] | 18 | class GrShaderCaps; | 
| Brian Salomon | 18dfa98 | 2017-04-03 16:57:43 -0400 | [diff] [blame] | 19 | class GrTexture; | 
| egdaniel | c230414 | 2014-12-11 13:15:13 -0800 | [diff] [blame] | 20 |  | 
| egdaniel | fa4cc8b | 2015-11-13 08:34:52 -0800 | [diff] [blame] | 21 | class GrGLSLXferProcessor { | 
| egdaniel | c230414 | 2014-12-11 13:15:13 -0800 | [diff] [blame] | 22 | public: | 
| egdaniel | fa4cc8b | 2015-11-13 08:34:52 -0800 | [diff] [blame] | 23 |     GrGLSLXferProcessor() {} | 
 | 24 |     virtual ~GrGLSLXferProcessor() {} | 
| egdaniel | c230414 | 2014-12-11 13:15:13 -0800 | [diff] [blame] | 25 |  | 
| Brian Salomon | 18dfa98 | 2017-04-03 16:57:43 -0400 | [diff] [blame] | 26 |     using SamplerHandle = GrGLSLUniformHandler::SamplerHandle; | 
| egdaniel | 09aa1fc | 2016-04-20 07:09:46 -0700 | [diff] [blame] | 27 |  | 
| egdaniel | c230414 | 2014-12-11 13:15:13 -0800 | [diff] [blame] | 28 |     struct EmitArgs { | 
| egdaniel | 7ea439b | 2015-12-03 09:20:44 -0800 | [diff] [blame] | 29 |         EmitArgs(GrGLSLXPFragmentBuilder* fragBuilder, | 
 | 30 |                  GrGLSLUniformHandler* uniformHandler, | 
| Brian Salomon | 94efbf5 | 2016-11-29 13:43:05 -0500 | [diff] [blame] | 31 |                  const GrShaderCaps* caps, | 
| egdaniel | c230414 | 2014-12-11 13:15:13 -0800 | [diff] [blame] | 32 |                  const GrXferProcessor& xp, | 
 | 33 |                  const char* inputColor, | 
 | 34 |                  const char* inputCoverage, | 
 | 35 |                  const char* outputPrimary, | 
 | 36 |                  const char* outputSecondary, | 
| Brian Salomon | 18dfa98 | 2017-04-03 16:57:43 -0400 | [diff] [blame] | 37 |                  const SamplerHandle dstTextureSamplerHandle, | 
 | 38 |                  GrSurfaceOrigin dstTextureOrigin) | 
| Brian Salomon | 42c456f | 2017-03-06 11:29:48 -0500 | [diff] [blame] | 39 |                 : fXPFragBuilder(fragBuilder) | 
 | 40 |                 , fUniformHandler(uniformHandler) | 
 | 41 |                 , fShaderCaps(caps) | 
 | 42 |                 , fXP(xp) | 
| Michael Ludwig | 231de03 | 2018-08-30 14:33:01 -0400 | [diff] [blame] | 43 |                 , fInputColor(inputColor ? inputColor : "half4(1.0)") | 
| Brian Salomon | 42c456f | 2017-03-06 11:29:48 -0500 | [diff] [blame] | 44 |                 , fInputCoverage(inputCoverage) | 
 | 45 |                 , fOutputPrimary(outputPrimary) | 
 | 46 |                 , fOutputSecondary(outputSecondary) | 
| Brian Salomon | 18dfa98 | 2017-04-03 16:57:43 -0400 | [diff] [blame] | 47 |                 , fDstTextureSamplerHandle(dstTextureSamplerHandle) | 
 | 48 |                 , fDstTextureOrigin(dstTextureOrigin) {} | 
| egdaniel | 4ca2e60 | 2015-11-18 08:01:26 -0800 | [diff] [blame] | 49 |         GrGLSLXPFragmentBuilder* fXPFragBuilder; | 
| egdaniel | 7ea439b | 2015-12-03 09:20:44 -0800 | [diff] [blame] | 50 |         GrGLSLUniformHandler* fUniformHandler; | 
| Brian Salomon | 1edc5b9 | 2016-11-29 13:43:46 -0500 | [diff] [blame] | 51 |         const GrShaderCaps* fShaderCaps; | 
| egdaniel | c230414 | 2014-12-11 13:15:13 -0800 | [diff] [blame] | 52 |         const GrXferProcessor& fXP; | 
 | 53 |         const char* fInputColor; | 
 | 54 |         const char* fInputCoverage; | 
 | 55 |         const char* fOutputPrimary; | 
 | 56 |         const char* fOutputSecondary; | 
| Brian Salomon | 18dfa98 | 2017-04-03 16:57:43 -0400 | [diff] [blame] | 57 |         const SamplerHandle fDstTextureSamplerHandle; | 
 | 58 |         GrSurfaceOrigin fDstTextureOrigin; | 
| egdaniel | c230414 | 2014-12-11 13:15:13 -0800 | [diff] [blame] | 59 |     }; | 
 | 60 |     /** | 
 | 61 |      * This is similar to emitCode() in the base class, except it takes a full shader builder. | 
 | 62 |      * This allows the effect subclass to emit vertex code. | 
 | 63 |      */ | 
| bsalomon | 50785a3 | 2015-02-06 07:02:37 -0800 | [diff] [blame] | 64 |     void emitCode(const EmitArgs&); | 
| egdaniel | c230414 | 2014-12-11 13:15:13 -0800 | [diff] [blame] | 65 |  | 
| egdaniel | fa4cc8b | 2015-11-13 08:34:52 -0800 | [diff] [blame] | 66 |     /** A GrGLSLXferProcessor instance can be reused with any GrGLSLXferProcessor that produces | 
 | 67 |         the same stage key; this function reads data from a GrGLSLXferProcessor and uploads any | 
| egdaniel | c230414 | 2014-12-11 13:15:13 -0800 | [diff] [blame] | 68 |         uniform variables required  by the shaders created in emitCode(). The GrXferProcessor | 
| egdaniel | fa4cc8b | 2015-11-13 08:34:52 -0800 | [diff] [blame] | 69 |         parameter is guaranteed to be of the same type that created this GrGLSLXferProcessor and | 
 | 70 |         to have an identical processor key as the one that created this GrGLSLXferProcessor. This | 
 | 71 |         function calls onSetData on the subclass of GrGLSLXferProcessor | 
| bsalomon | 50785a3 | 2015-02-06 07:02:37 -0800 | [diff] [blame] | 72 |      */ | 
| Brian Salomon | 18dfa98 | 2017-04-03 16:57:43 -0400 | [diff] [blame] | 73 |     void setData(const GrGLSLProgramDataManager& pdm, const GrXferProcessor& xp, | 
 | 74 |                  const GrTexture* dstTexture, const SkIPoint& dstTextureOffset); | 
| bsalomon | 50785a3 | 2015-02-06 07:02:37 -0800 | [diff] [blame] | 75 |  | 
| robertphillips | 727b7d2 | 2016-01-26 12:07:13 -0800 | [diff] [blame] | 76 | protected: | 
 | 77 |     static void DefaultCoverageModulation(GrGLSLXPFragmentBuilder* fragBuilder, | 
 | 78 |                                           const char* srcCoverage, | 
 | 79 |                                           const char* dstColor, | 
 | 80 |                                           const char* outColor, | 
 | 81 |                                           const char* outColorSecondary, | 
 | 82 |                                           const GrXferProcessor& proc); | 
| robertphillips | f42fca4 | 2016-01-27 05:00:04 -0800 | [diff] [blame] | 83 |  | 
| egdaniel | c230414 | 2014-12-11 13:15:13 -0800 | [diff] [blame] | 84 | private: | 
| cdalton | edbb31f | 2015-06-08 12:14:44 -0700 | [diff] [blame] | 85 |     /** | 
 | 86 |      * Called by emitCode() when the XP will not be performing a dst read. This method is | 
 | 87 |      * responsible for both blending and coverage. A subclass only needs to implement this method if | 
 | 88 |      * it can construct a GrXferProcessor that will not read the dst color. | 
 | 89 |      */ | 
 | 90 |     virtual void emitOutputsForBlendState(const EmitArgs&) { | 
| Ben Wagner | b4aab9a | 2017-08-16 10:53:04 -0400 | [diff] [blame] | 91 |         SK_ABORT("emitOutputsForBlendState not implemented."); | 
| cdalton | edbb31f | 2015-06-08 12:14:44 -0700 | [diff] [blame] | 92 |     } | 
 | 93 |  | 
 | 94 |     /** | 
 | 95 |      * Called by emitCode() when the XP will perform a dst read. This method only needs to supply | 
 | 96 |      * the blending logic. The base class applies coverage. A subclass only needs to implement this | 
 | 97 |      * method if it can construct a GrXferProcessor that reads the dst color. | 
 | 98 |      */ | 
| egdaniel | 7ea439b | 2015-12-03 09:20:44 -0800 | [diff] [blame] | 99 |     virtual void emitBlendCodeForDstRead(GrGLSLXPFragmentBuilder*, | 
 | 100 |                                          GrGLSLUniformHandler*, | 
| egdaniel | 8dcdedc | 2015-11-11 06:27:20 -0800 | [diff] [blame] | 101 |                                          const char* srcColor, | 
| egdaniel | f34b293 | 2015-12-01 13:54:06 -0800 | [diff] [blame] | 102 |                                          const char* srcCoverage, | 
| egdaniel | 8dcdedc | 2015-11-11 06:27:20 -0800 | [diff] [blame] | 103 |                                          const char* dstColor, | 
 | 104 |                                          const char* outColor, | 
| egdaniel | f34b293 | 2015-12-01 13:54:06 -0800 | [diff] [blame] | 105 |                                          const char* outColorSecondary, | 
| egdaniel | 8dcdedc | 2015-11-11 06:27:20 -0800 | [diff] [blame] | 106 |                                          const GrXferProcessor&) { | 
| Ben Wagner | b4aab9a | 2017-08-16 10:53:04 -0400 | [diff] [blame] | 107 |         SK_ABORT("emitBlendCodeForDstRead not implemented."); | 
| cdalton | edbb31f | 2015-06-08 12:14:44 -0700 | [diff] [blame] | 108 |     } | 
| bsalomon | 50785a3 | 2015-02-06 07:02:37 -0800 | [diff] [blame] | 109 |  | 
| egdaniel | 018fb62 | 2015-10-28 07:26:40 -0700 | [diff] [blame] | 110 |     virtual void onSetData(const GrGLSLProgramDataManager&, const GrXferProcessor&) = 0; | 
| bsalomon | 50785a3 | 2015-02-06 07:02:37 -0800 | [diff] [blame] | 111 |  | 
| egdaniel | 018fb62 | 2015-10-28 07:26:40 -0700 | [diff] [blame] | 112 |     GrGLSLProgramDataManager::UniformHandle fDstTopLeftUni; | 
 | 113 |     GrGLSLProgramDataManager::UniformHandle fDstScaleUni; | 
| egdaniel | c230414 | 2014-12-11 13:15:13 -0800 | [diff] [blame] | 114 | }; | 
 | 115 | #endif |