Index: third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp |
diff --git a/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp b/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp |
index aae2e264cea6aa8a2a736600d699b7bc4c8b6cb3..6e32543059c28397f782d57412a0b2aedb3a4b5f 100644 |
--- a/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp |
+++ b/third_party/WebKit/Source/modules/webgl/WebGLRenderingContextBase.cpp |
@@ -2047,6 +2047,33 @@ WebGLRenderbuffer* WebGLRenderingContextBase::ensureEmulatedStencilBuffer(GLenum |
return renderbuffer->emulatedStencilBuffer(); |
} |
+const WebGLSamplerState* WebGLRenderingContextBase::getTextureUnitSamplerState(GLenum target, GLuint unit) const |
+{ |
+ ASSERT(unit < m_textureUnits.size()); |
+ |
+ WebGLTexture* texture = nullptr; |
+ |
+ switch (target) { |
+ case GL_TEXTURE_2D: |
+ texture = m_textureUnits[unit].m_texture2DBinding; |
+ break; |
+ case GL_TEXTURE_CUBE_MAP: |
+ texture = m_textureUnits[unit].m_textureCubeMapBinding; |
+ break; |
+ case GL_TEXTURE_2D_ARRAY: |
+ texture = m_textureUnits[unit].m_texture2DArrayBinding; |
+ break; |
+ case GL_TEXTURE_3D: |
+ texture = m_textureUnits[unit].m_texture3DBinding; |
+ break; |
+ } |
+ |
+ if (texture) |
+ return texture->getSamplerState(); |
+ |
+ return nullptr; |
+} |
+ |
void WebGLRenderingContextBase::setBoundVertexArrayObject(ScriptState* scriptState, WebGLVertexArrayObjectBase* arrayObject) |
{ |
if (arrayObject) |
@@ -5401,8 +5428,10 @@ void WebGLRenderingContextBase::handleTextureCompleteness(const char* functionNa |
WebGLTexture::TextureExtensionFlag flag = static_cast<WebGLTexture::TextureExtensionFlag>((extensionEnabled(OESTextureFloatLinearName) ? WebGLTexture::TextureFloatLinearExtensionEnabled : 0) |
| ((extensionEnabled(OESTextureHalfFloatLinearName) || isWebGL2OrHigher()) ? WebGLTexture::TextureHalfFloatLinearExtensionEnabled : 0)); |
for (unsigned ii = 0; ii < m_onePlusMaxNonDefaultTextureUnit; ++ii) { |
- if ((m_textureUnits[ii].m_texture2DBinding.get() && m_textureUnits[ii].m_texture2DBinding->needToUseBlackTexture(flag)) |
- || (m_textureUnits[ii].m_textureCubeMapBinding.get() && m_textureUnits[ii].m_textureCubeMapBinding->needToUseBlackTexture(flag))) { |
+ const WebGLSamplerState* samplerState2D = getTextureUnitSamplerState(GL_TEXTURE_2D, ii); |
+ const WebGLSamplerState* samplerStateCubeMap = getTextureUnitSamplerState(GL_TEXTURE_CUBE_MAP, ii); |
+ if ((m_textureUnits[ii].m_texture2DBinding.get() && m_textureUnits[ii].m_texture2DBinding->needToUseBlackTexture(flag, samplerState2D)) |
+ || (m_textureUnits[ii].m_textureCubeMapBinding.get() && m_textureUnits[ii].m_textureCubeMapBinding->needToUseBlackTexture(flag, samplerStateCubeMap))) { |
if (ii != m_activeTextureUnit) { |
webContext()->activeTexture(GL_TEXTURE0 + ii); |
resetActiveUnit = true; |
@@ -5423,9 +5452,9 @@ void WebGLRenderingContextBase::handleTextureCompleteness(const char* functionNa |
tex2D = m_textureUnits[ii].m_texture2DBinding.get(); |
texCubeMap = m_textureUnits[ii].m_textureCubeMapBinding.get(); |
} |
- if (m_textureUnits[ii].m_texture2DBinding && m_textureUnits[ii].m_texture2DBinding->needToUseBlackTexture(flag)) |
+ if (m_textureUnits[ii].m_texture2DBinding && m_textureUnits[ii].m_texture2DBinding->needToUseBlackTexture(flag, samplerState2D)) |
webContext()->bindTexture(GL_TEXTURE_2D, objectOrZero(tex2D)); |
- if (m_textureUnits[ii].m_textureCubeMapBinding && m_textureUnits[ii].m_textureCubeMapBinding->needToUseBlackTexture(flag)) |
+ if (m_textureUnits[ii].m_textureCubeMapBinding && m_textureUnits[ii].m_textureCubeMapBinding->needToUseBlackTexture(flag, samplerStateCubeMap)) |
webContext()->bindTexture(GL_TEXTURE_CUBE_MAP, objectOrZero(texCubeMap)); |
} |
} |