@@ -202,11 +202,16 @@ static GrGLenum filter_to_gl_min_filter(GrSamplerState::Filter filter) {
202202 return 0 ;
203203}
204204
205- static inline GrGLenum wrap_mode_to_gl_wrap (GrSamplerState::WrapMode wrapMode) {
205+ static inline GrGLenum wrap_mode_to_gl_wrap (GrSamplerState::WrapMode wrapMode,
206+ const GrCaps& caps) {
206207 switch (wrapMode) {
207208 case GrSamplerState::WrapMode::kClamp : return GR_GL_CLAMP_TO_EDGE;
208209 case GrSamplerState::WrapMode::kRepeat : return GR_GL_REPEAT;
209210 case GrSamplerState::WrapMode::kMirrorRepeat : return GR_GL_MIRRORED_REPEAT;
211+ case GrSamplerState::WrapMode::kClampToBorder :
212+ // May not be supported but should have been caught earlier
213+ SkASSERT (caps.clampToBorderSupport ());
214+ return GR_GL_CLAMP_TO_BORDER;
210215 }
211216 SK_ABORT (" Unknown wrap mode" );
212217 return 0 ;
@@ -242,8 +247,8 @@ class GrGLGpu::SamplerObjectCache {
242247 fSamplers [index] = s;
243248 auto minFilter = filter_to_gl_min_filter (state.filter ());
244249 auto magFilter = filter_to_gl_mag_filter (state.filter ());
245- auto wrapX = wrap_mode_to_gl_wrap (state.wrapModeX ());
246- auto wrapY = wrap_mode_to_gl_wrap (state.wrapModeY ());
250+ auto wrapX = wrap_mode_to_gl_wrap (state.wrapModeX (), fGpu -> glCaps () );
251+ auto wrapY = wrap_mode_to_gl_wrap (state.wrapModeY (), fGpu -> glCaps () );
247252 GR_GL_CALL (fGpu ->glInterface (),
248253 SamplerParameteri (s, GR_GL_TEXTURE_MIN_FILTER, minFilter));
249254 GR_GL_CALL (fGpu ->glInterface (),
@@ -284,16 +289,16 @@ class GrGLGpu::SamplerObjectCache {
284289 int filter = static_cast <int >(state.filter ());
285290 SkASSERT (filter >= 0 && filter < 3 );
286291 int wrapX = static_cast <int >(state.wrapModeX ());
287- SkASSERT (wrapX >= 0 && wrapX < 3 );
292+ SkASSERT (wrapX >= 0 && wrapX < 4 );
288293 int wrapY = static_cast <int >(state.wrapModeY ());
289- SkASSERT (wrapY >= 0 && wrapY < 3 );
290- int idx = 9 * filter + 3 * wrapX + wrapY;
294+ SkASSERT (wrapY >= 0 && wrapY < 4 );
295+ int idx = 16 * filter + 4 * wrapX + wrapY;
291296 SkASSERT (idx < kNumSamplers );
292297 return idx;
293298 }
294299
295300 GrGLGpu* fGpu ;
296- static constexpr int kNumSamplers = 27 ;
301+ static constexpr int kNumSamplers = 48 ;
297302 std::unique_ptr<GrGLuint[]> fHWBoundSamplers ;
298303 GrGLuint fSamplers [kNumSamplers ];
299304 int fNumTextureUnits ;
@@ -2854,8 +2859,8 @@ void GrGLGpu::bindTexture(int unitIdx, GrSamplerState samplerState, GrGLTexture*
28542859 newSamplerParams.fMinFilter = filter_to_gl_min_filter (samplerState.filter ());
28552860 newSamplerParams.fMagFilter = filter_to_gl_mag_filter (samplerState.filter ());
28562861
2857- newSamplerParams.fWrapS = wrap_mode_to_gl_wrap (samplerState.wrapModeX ());
2858- newSamplerParams.fWrapT = wrap_mode_to_gl_wrap (samplerState.wrapModeY ());
2862+ newSamplerParams.fWrapS = wrap_mode_to_gl_wrap (samplerState.wrapModeX (), this -> glCaps () );
2863+ newSamplerParams.fWrapT = wrap_mode_to_gl_wrap (samplerState.wrapModeY (), this -> glCaps () );
28592864
28602865 // These are the OpenGL default values.
28612866 newSamplerParams.fMinLOD = -1000 ;
@@ -2889,6 +2894,17 @@ void GrGLGpu::bindTexture(int unitIdx, GrSamplerState samplerState, GrGLTexture*
28892894 this ->setTextureUnit (unitIdx);
28902895 GL_CALL (TexParameteri (target, GR_GL_TEXTURE_WRAP_T, newSamplerParams.fWrapT ));
28912896 }
2897+ if (this ->glCaps ().clampToBorderSupport ()) {
2898+ // Make sure the border color is transparent black (the default)
2899+ if (setAll || oldSamplerParams.fBorderColorInvalid ) {
2900+ this ->setTextureUnit (unitIdx);
2901+ // Specify the transparent black as normalized signed integers. The conversion is
2902+ // defined as (2c+1)/(2^32-1), which makes it impossible to map a signed in to
2903+ // exactly 0.f. But 1/(2^32-1) is close enough.
2904+ static const GrGLint kTransparentBlack [4 ] = {0 , 0 , 0 , 0 };
2905+ GL_CALL (TexParameteriv (target, GR_GL_TEXTURE_BORDER_COLOR, kTransparentBlack ));
2906+ }
2907+ }
28922908 }
28932909 GrGLTexture::NonSamplerParams newNonSamplerParams;
28942910 newNonSamplerParams.fBaseMipMapLevel = 0 ;
0 commit comments