diff --git a/MobileGL/MG_Backend/DirectGLES/DirectGLES.cpp b/MobileGL/MG_Backend/DirectGLES/DirectGLES.cpp index 83c87e76..58769417 100644 --- a/MobileGL/MG_Backend/DirectGLES/DirectGLES.cpp +++ b/MobileGL/MG_Backend/DirectGLES/DirectGLES.cpp @@ -24,6 +24,7 @@ namespace MobileGL::MG_Backend::DirectGLES { void ErrorLopper::Clear() { GLenum err = MG_External::GLES::glGetError(); while (err != GL_NO_ERROR) { + MGLOG_D("Stray GL Error cleared: %s", MG_Util::ConvertGLEnumToString(err).c_str()); err = MG_External::GLES::glGetError(); } } @@ -336,11 +337,12 @@ namespace MobileGL::MG_Backend::DirectGLES { const auto& samplerObj = textureObject->GetSamplerObject(); const auto minfilter = samplerObj->GetMinFilter(); + const auto mipfilter = samplerObj->GetMipmapMode(); MG_External::GLES::glTexParameteri(target, GL_TEXTURE_MIN_FILTER, - MG_Util::ConvertSamplerFilterModeToGLEnum(minfilter)); + MG_Util::ConvertSamplerFilterModeToGLEnum(minfilter, mipfilter)); const auto magfilter = samplerObj->GetMagFilter(); MG_External::GLES::glTexParameteri(target, GL_TEXTURE_MAG_FILTER, - MG_Util::ConvertSamplerFilterModeToGLEnum(magfilter)); + MG_Util::ConvertSamplerFilterModeToGLEnum(magfilter, SamplerMipmapMode::None)); MG_External::GLES::glTexParameterf(target, GL_TEXTURE_MIN_LOD, samplerObj->GetMinLod()); MG_External::GLES::glTexParameterf(target, GL_TEXTURE_MAX_LOD, samplerObj->GetMaxLod()); } @@ -499,11 +501,23 @@ namespace MobileGL::MG_Backend::DirectGLES { DebugImpl::ErrorLopper errorLopper; MGLOG_D("%s: Backend", __func__); TextureImpl::SyncNeccessaryTextures(); + errorLopper.Loop([file = __FILE__, line = __LINE__](auto err) { + MGLOG_D("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str()); + }); FramebufferImpl::SyncCurrentFBO(); + errorLopper.Loop([file = __FILE__, line = __LINE__](auto err) { + MGLOG_D("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str()); + }); RenderStateImpl::SyncRenderState(); + errorLopper.Loop([file = __FILE__, line = __LINE__](auto err) { + MGLOG_D("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str()); + }); GLint realInternalFormat; MG_External::GLES::glGetTexLevelParameteriv(target, level, GL_TEXTURE_INTERNAL_FORMAT, &realInternalFormat); + errorLopper.Loop([file = __FILE__, line = __LINE__](auto err) { + MGLOG_D("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str()); + }); internalformat = (GLenum)realInternalFormat; auto mglInternalFormat = MG_Util::ConvertGLEnumToTextureInternalFormat(internalformat); @@ -518,18 +532,28 @@ namespace MobileGL::MG_Backend::DirectGLES { if (!isDepthFormat) { MG_External::GLES::glCopyTexImage2D( target, level, internalformat, x, y, width, height, border); - + errorLopper.Loop([file = __FILE__, line = __LINE__](auto err) { + MGLOG_D("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str()); + }); } else { MGLOG_D("%s: Backend depth", __func__); MG_External::GLES::glTexImage2D(target, level, (GLint)internalformat, width, height, border, format, type, nullptr); FramebufferImpl::BackendFramebufferBindingProtector drawFboProtector(GL_DRAW_FRAMEBUFFER); FramebufferImpl::BackendFramebufferBindingProtector readFboProtector(GL_READ_FRAMEBUFFER); - + errorLopper.Loop([file = __FILE__, line = __LINE__](auto err) { + MGLOG_D("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str()); + }); FramebufferImpl::BackendFramebufferBindingProtector::BindTempFBO(FramebufferTarget::Draw); + errorLopper.Loop([file = __FILE__, line = __LINE__](auto err) { + MGLOG_D("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str()); + }); GLint currentTex; MG_External::GLES::glGetIntegerv(Utils::GetBindingQuery(target, false), ¤tTex); + errorLopper.Loop([file = __FILE__, line = __LINE__](auto err) { + MGLOG_D("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str()); + }); GLenum attachment = isStencilFormat ? GL_DEPTH_STENCIL_ATTACHMENT : GL_DEPTH_ATTACHMENT; MG_External::GLES::glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, attachment, target, currentTex, level); @@ -540,7 +564,9 @@ namespace MobileGL::MG_Backend::DirectGLES { } MG_External::GLES::glBlitFramebuffer(x, y, x + width, y + height, 0, 0, width, height, GL_DEPTH_BUFFER_BIT | (isStencilFormat ? GL_STENCIL_BUFFER_BIT : 0), GL_NEAREST); - + errorLopper.Loop([file = __FILE__, line = __LINE__](auto err) { + MGLOG_D("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str()); + }); // Protector will automatically revert to previous fbo states } @@ -569,14 +595,27 @@ namespace MobileGL::MG_Backend::DirectGLES { MGLOG_D("%s: Backend", __func__); TextureImpl::SyncNeccessaryTextures(); + errorLopper.Loop([file = __FILE__, line = __LINE__](auto err) { + MGLOG_D("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str()); + }); FramebufferImpl::SyncCurrentFBO(); + errorLopper.Loop([file = __FILE__, line = __LINE__](auto err) { + MGLOG_D("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str()); + }); RenderStateImpl::SyncRenderState(); + errorLopper.Loop([file = __FILE__, line = __LINE__](auto err) { + MGLOG_D("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str()); + }); BindCurrentFBO(FramebufferTarget::Read); - + errorLopper.Loop([file = __FILE__, line = __LINE__](auto err) { + MGLOG_D("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str()); + }); GLenum internalFormat; MG_External::GLES::glGetTexLevelParameteriv(target, level, GL_TEXTURE_INTERNAL_FORMAT, (GLint *)&internalFormat); - + errorLopper.Loop([file = __FILE__, line = __LINE__](auto err) { + MGLOG_D("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str()); + }); auto mglInternalFormat = MG_Util::ConvertGLEnumToTextureInternalFormat(internalFormat); bool isDepthFormat = MG_Util::IsDepthFormatInternalFormat(mglInternalFormat); @@ -585,20 +624,30 @@ namespace MobileGL::MG_Backend::DirectGLES { if (!isDepthFormat) { MG_External::GLES::glCopyTexSubImage2D( target, level, xoffset, yoffset, x, y, width, height); - + errorLopper.Loop([file = __FILE__, line = __LINE__](auto err) { + MGLOG_D("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str()); + }); } else { MGLOG_D("%s: Backend depth", __func__); FramebufferImpl::BackendFramebufferBindingProtector drawFboProtector(GL_DRAW_FRAMEBUFFER); FramebufferImpl::BackendFramebufferBindingProtector readFboProtector(GL_READ_FRAMEBUFFER); - + errorLopper.Loop([file = __FILE__, line = __LINE__](auto err) { + MGLOG_D("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str()); + }); FramebufferImpl::BackendFramebufferBindingProtector::BindTempFBO(FramebufferTarget::Draw); - + errorLopper.Loop([file = __FILE__, line = __LINE__](auto err) { + MGLOG_D("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str()); + }); GLint currentTex; MG_External::GLES::glGetIntegerv(Utils::GetBindingQuery(target, false), ¤tTex); - + errorLopper.Loop([file = __FILE__, line = __LINE__](auto err) { + MGLOG_D("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str()); + }); GLenum attachment = isStencilFormat ? GL_DEPTH_STENCIL_ATTACHMENT : GL_DEPTH_ATTACHMENT; MG_External::GLES::glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, attachment, target, currentTex, level); - + errorLopper.Loop([file = __FILE__, line = __LINE__](auto err) { + MGLOG_D("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str()); + }); if (MG_External::GLES::glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { // Protector will automatically revert to previous fbo states return; @@ -606,7 +655,9 @@ namespace MobileGL::MG_Backend::DirectGLES { MG_External::GLES::glBlitFramebuffer(x, y, x + width, y + height, xoffset, yoffset, xoffset + width, yoffset + height, GL_DEPTH_BUFFER_BIT | (isStencilFormat ? GL_STENCIL_BUFFER_BIT : 0), GL_NEAREST); - + errorLopper.Loop([file = __FILE__, line = __LINE__](auto err) { + MGLOG_D("ES error (%s:%d): %s", file, line, MG_Util::ConvertGLEnumToString(err).c_str()); + }); // Protector will automatically revert to previous fbo states } } diff --git a/MobileGL/MG_Backend/DirectGLES/Managers.cpp b/MobileGL/MG_Backend/DirectGLES/Managers.cpp index d62460ad..e8f72408 100644 --- a/MobileGL/MG_Backend/DirectGLES/Managers.cpp +++ b/MobileGL/MG_Backend/DirectGLES/Managers.cpp @@ -327,10 +327,29 @@ namespace MobileGL::MG_Backend::DirectGLES { MG_External::GLES::glTexParameteri(target, glName, \ MG_Util::ConvertSampler##type##ToGLEnum(samplerParams.internalName)); \ m_cacheSamplerParameters.internalName = samplerParams.internalName; \ + errorLopper.Loop([file = __FILE__, line = __LINE__, func = __func__, t = MG_Util::ConvertSampler##type##ToGLEnum(samplerParams.internalName)](GLenum err) { \ + MGLOG_D("%s(%s:%d) ES error %s, GL_TEXTURE_MIN_FILTER = %s", func, file, line, \ + MG_Util::ConvertGLEnumToString(err).c_str(), MG_Util::ConvertGLEnumToString(t).c_str());\ + }); \ } - SYNC_TEX_SAMPLER_PARAM_IF_CHANGED(minFilter, GL_TEXTURE_MIN_FILTER, FilterMode) - SYNC_TEX_SAMPLER_PARAM_IF_CHANGED(magFilter, GL_TEXTURE_MAG_FILTER, FilterMode) + if (m_cacheSamplerParameters.minFilter != samplerParams.minFilter) { + MG_External::GLES::glTexParameteri(target, GL_TEXTURE_MIN_FILTER, + MG_Util::ConvertSamplerFilterModeToGLEnum(samplerParams.minFilter, samplerParams.mipmapMode)); + m_cacheSamplerParameters.minFilter = samplerParams.minFilter; + m_cacheSamplerParameters.mipmapMode = samplerParams.mipmapMode; + } + if (m_cacheSamplerParameters.magFilter != samplerParams.magFilter) { + MG_External::GLES::glTexParameteri(target, GL_TEXTURE_MAG_FILTER, + MG_Util::ConvertSamplerFilterModeToGLEnum(samplerParams.magFilter, SamplerMipmapMode::None)); + m_cacheSamplerParameters.magFilter = samplerParams.magFilter; + } + errorLopper.Loop([file = __FILE__, line = __LINE__, func = __func__](GLenum err) { + MGLOG_D("%s(%s:%d) ES error %s", func, file, line, MG_Util::ConvertGLEnumToString(err).c_str()); + }); + +// SYNC_TEX_SAMPLER_PARAM_IF_CHANGED(minFilter, GL_TEXTURE_MIN_FILTER, FilterMode) +// SYNC_TEX_SAMPLER_PARAM_IF_CHANGED(magFilter, GL_TEXTURE_MAG_FILTER, FilterMode) SYNC_TEX_SAMPLER_PARAM_IF_CHANGED(wrapS, GL_TEXTURE_WRAP_S, WrapMode) SYNC_TEX_SAMPLER_PARAM_IF_CHANGED(wrapT, GL_TEXTURE_WRAP_T, WrapMode) SYNC_TEX_SAMPLER_PARAM_IF_CHANGED(wrapR, GL_TEXTURE_WRAP_R, WrapMode) @@ -344,7 +363,10 @@ namespace MobileGL::MG_Backend::DirectGLES { MG_External::GLES::glTexParameterf(target, GL_TEXTURE_MAX_LOD, samplerParams.maxLod); m_cacheSamplerParameters.maxLod = samplerParams.maxLod; } - + errorLopper.Loop([file = __FILE__, line = __LINE__, func = __func__](GLenum err) { + MGLOG_D("%s(%s:%d) ES error %s", func, file, line, + MG_Util::ConvertGLEnumToString(err).c_str()); + }); #undef SYNC_TEX_SAMPLER_PARAM_IF_CHANGED } @@ -353,7 +375,15 @@ namespace MobileGL::MG_Backend::DirectGLES { const auto& levelRange = stateTextureObject->GetLevelRange(); MG_External::GLES::glTexParameteri(target, GL_TEXTURE_BASE_LEVEL, static_cast(levelRange.x())); + errorLopper.Loop([file = __FILE__, line = __LINE__, func = __func__](GLenum err) { + MGLOG_D("%s(%s:%d) ES error %s", func, file, line, + MG_Util::ConvertGLEnumToString(err).c_str()); + }); MG_External::GLES::glTexParameteri(target, GL_TEXTURE_MAX_LEVEL, static_cast(levelRange.y())); + errorLopper.Loop([file = __FILE__, line = __LINE__, func = __func__](GLenum err) { + MGLOG_D("%s(%s:%d) ES error %s", func, file, line, + MG_Util::ConvertGLEnumToString(err).c_str()); + }); GLenum swizzleParams[4] = {MG_Util::ConvertTextureSwizzleParamToGLEnum( stateTextureObject->GetSwizzleParam(TextureSwizzleParam::Red)), MG_Util::ConvertTextureSwizzleParamToGLEnum( @@ -362,8 +392,26 @@ namespace MobileGL::MG_Backend::DirectGLES { stateTextureObject->GetSwizzleParam(TextureSwizzleParam::Blue)), MG_Util::ConvertTextureSwizzleParamToGLEnum( stateTextureObject->GetSwizzleParam(TextureSwizzleParam::Alpha))}; - MG_External::GLES::glTexParameteriv(target, GL_TEXTURE_SWIZZLE_RGBA, - reinterpret_cast(swizzleParams)); + MG_External::GLES::glTexParameteri(target, GL_TEXTURE_SWIZZLE_R, + MG_Util::ConvertTextureSwizzleParamToGLEnum( + stateTextureObject->GetSwizzleParam(TextureSwizzleParam::Red))); + MG_External::GLES::glTexParameteri(target, GL_TEXTURE_SWIZZLE_G, + MG_Util::ConvertTextureSwizzleParamToGLEnum( + stateTextureObject->GetSwizzleParam(TextureSwizzleParam::Green))); + MG_External::GLES::glTexParameteri(target, GL_TEXTURE_SWIZZLE_B, + MG_Util::ConvertTextureSwizzleParamToGLEnum( + stateTextureObject->GetSwizzleParam(TextureSwizzleParam::Blue))); + MG_External::GLES::glTexParameteri(target, GL_TEXTURE_SWIZZLE_A, + MG_Util::ConvertTextureSwizzleParamToGLEnum( + stateTextureObject->GetSwizzleParam(TextureSwizzleParam::Alpha))); + errorLopper.Loop([file = __FILE__, line = __LINE__, func = __func__, swizzleParams](GLenum err) { + MGLOG_D("%s(%s:%d) ES error %s, GL_TEXTURE_SWIZZLE_RGBA: [%s %s %s %s]", func, file, line, + MG_Util::ConvertGLEnumToString(err).c_str(), + MG_Util::ConvertGLEnumToString(swizzleParams[0]).c_str(), + MG_Util::ConvertGLEnumToString(swizzleParams[1]).c_str(), + MG_Util::ConvertGLEnumToString(swizzleParams[2]).c_str(), + MG_Util::ConvertGLEnumToString(swizzleParams[3]).c_str()); + }); const auto& borderColor = stateTextureObject->GetBorderColor(); GLfloat borderColorArray[4] = {borderColor.x(), borderColor.y(), borderColor.z(), borderColor.w()}; MG_External::GLES::glTexParameterfv(target, GL_TEXTURE_BORDER_COLOR, borderColorArray); @@ -387,13 +435,23 @@ namespace MobileGL::MG_Backend::DirectGLES { BufferImpl::BackendBufferBindingProtector pixelUnpackProtector = BufferImpl::BackendBufferBindingProtector(GL_PIXEL_UNPACK_BUFFER); MG_External::GLES::glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0); + errorLopper.Loop([file = __FILE__, line = __LINE__, func = __func__](GLenum err) { + MGLOG_D("%s(%s:%d) ES error: %s", func, file, line, MG_Util::ConvertGLEnumToString(err).c_str()); + }); MG_External::GLES::glTexSubImage2D(GL_TEXTURE_2D, static_cast(mipmap.level), 0, 0, static_cast(mipmap.size.x()), static_cast(mipmap.size.y()), glFormat, glType, mipmap.hasData ? mipmap.data.data() : nullptr); + errorLopper.Loop([file = __FILE__, line = __LINE__, func = __func__, &mipmap, glFormat, glType](GLenum err) { + MGLOG_D("%s(%s:%d) ES error at glTexSubImage2D: %s (mip %d, %dx%d, %s, %s)", func, file, line, MG_Util::ConvertGLEnumToString(err).c_str(), + mipmap.level, mipmap.size.x(), mipmap.size.y(), MG_Util::ConvertGLEnumToString(glFormat).c_str(), MG_Util::ConvertGLEnumToString(glType).c_str()); + }); stateTextureObject->UnmarkMipmapDirty(mipmap.level); } } + errorLopper.Loop([file = __FILE__, line = __LINE__, func = __func__](GLenum err) { + MGLOG_D("%s(%s:%d) ES error: %s", func, file, line, MG_Util::ConvertGLEnumToString(err).c_str()); + }); m_prevTextureInfo = currentTextureInfo; } @@ -725,8 +783,20 @@ namespace MobileGL::MG_Backend::DirectGLES { m_cacheSamplerParameters.internalName = samplerParams.internalName; \ } - SYNC_SAMPLER_PARAM_IF_CHANGED(minFilter, GL_TEXTURE_MIN_FILTER, FilterMode) - SYNC_SAMPLER_PARAM_IF_CHANGED(magFilter, GL_TEXTURE_MAG_FILTER, FilterMode) + if (m_cacheSamplerParameters.minFilter != samplerParams.minFilter) { + MG_External::GLES::glSamplerParameteri(m_backendSamplerId, GL_TEXTURE_MIN_FILTER, + MG_Util::ConvertSamplerFilterModeToGLEnum(samplerParams.minFilter, samplerParams.mipmapMode)); + m_cacheSamplerParameters.minFilter = samplerParams.minFilter; + m_cacheSamplerParameters.mipmapMode = samplerParams.mipmapMode; + } + if (m_cacheSamplerParameters.magFilter != samplerParams.magFilter) { + MG_External::GLES::glSamplerParameteri(m_backendSamplerId, GL_TEXTURE_MAG_FILTER, + MG_Util::ConvertSamplerFilterModeToGLEnum(samplerParams.magFilter, SamplerMipmapMode::None)); + m_cacheSamplerParameters.magFilter = samplerParams.magFilter; + } + +// SYNC_SAMPLER_PARAM_IF_CHANGED(minFilter, GL_TEXTURE_MIN_FILTER, FilterMode) +// SYNC_SAMPLER_PARAM_IF_CHANGED(magFilter, GL_TEXTURE_MAG_FILTER, FilterMode) SYNC_SAMPLER_PARAM_IF_CHANGED(wrapS, GL_TEXTURE_WRAP_S, WrapMode) SYNC_SAMPLER_PARAM_IF_CHANGED(wrapT, GL_TEXTURE_WRAP_T, WrapMode) SYNC_SAMPLER_PARAM_IF_CHANGED(wrapR, GL_TEXTURE_WRAP_R, WrapMode) diff --git a/MobileGL/MG_Impl/GLImpl/Sampler/GL_Sampler.cpp b/MobileGL/MG_Impl/GLImpl/Sampler/GL_Sampler.cpp index beca9c5f..5de0738e 100644 --- a/MobileGL/MG_Impl/GLImpl/Sampler/GL_Sampler.cpp +++ b/MobileGL/MG_Impl/GLImpl/Sampler/GL_Sampler.cpp @@ -28,6 +28,7 @@ namespace MobileGL { break; case GL_TEXTURE_MIN_FILTER: samplerObj->SetMinFilter(MG_Util::ConvertGLEnumToSamplerFilterMode(*(const GLint*)param)); + samplerObj->SetMipmapMode(MG_Util::ConvertGLEnumToSamplerMipmapMode(*(const GLint*)param)); break; case GL_TEXTURE_MAG_FILTER: samplerObj->SetMagFilter(MG_Util::ConvertGLEnumToSamplerFilterMode(*(const GLint*)param)); @@ -75,10 +76,10 @@ namespace MobileGL { *(GLint*)params = MG_Util::ConvertSamplerWrapModeToGLEnum(samplerObj->GetWrapR()); break; case GL_TEXTURE_MIN_FILTER: - *(GLint*)params = MG_Util::ConvertSamplerFilterModeToGLEnum(samplerObj->GetMinFilter()); + *(GLint*)params = MG_Util::ConvertSamplerFilterModeToGLEnum(samplerObj->GetMinFilter(), samplerObj->GetMipmapMode()); break; case GL_TEXTURE_MAG_FILTER: - *(GLint*)params = MG_Util::ConvertSamplerFilterModeToGLEnum(samplerObj->GetMagFilter()); + *(GLint*)params = MG_Util::ConvertSamplerFilterModeToGLEnum(samplerObj->GetMagFilter(), SamplerMipmapMode::None); break; case GL_TEXTURE_MIN_LOD: *(GLfloat*)params = samplerObj->GetMinLod(); diff --git a/MobileGL/MG_Impl/GLImpl/Texture/GL_Texture.cpp b/MobileGL/MG_Impl/GLImpl/Texture/GL_Texture.cpp index 5d540832..64672f32 100644 --- a/MobileGL/MG_Impl/GLImpl/Texture/GL_Texture.cpp +++ b/MobileGL/MG_Impl/GLImpl/Texture/GL_Texture.cpp @@ -156,6 +156,7 @@ namespace MobileGL { break; case GL_TEXTURE_MIN_FILTER: textureObject->GetSamplerObject()->SetMinFilter(MG_Util::ConvertGLEnumToSamplerFilterMode(param)); + textureObject->GetSamplerObject()->SetMipmapMode(MG_Util::ConvertGLEnumToSamplerMipmapMode(param)); break; case GL_TEXTURE_MIN_LOD: { Float maxLod = textureObject->GetSamplerObject()->GetMaxLod(); @@ -237,6 +238,7 @@ namespace MobileGL { break; case GL_TEXTURE_MIN_FILTER: textureObject->GetSamplerObject()->SetMinFilter(MG_Util::ConvertGLEnumToSamplerFilterMode(param)); + textureObject->GetSamplerObject()->SetMipmapMode(MG_Util::ConvertGLEnumToSamplerMipmapMode(param)); break; case GL_TEXTURE_MIN_LOD: { Float maxLod = textureObject->GetSamplerObject()->GetMaxLod(); @@ -474,13 +476,13 @@ namespace MobileGL { case GL_TEXTURE_MAG_FILTER: if (params) { *params = - MG_Util::ConvertSamplerFilterModeToGLEnum(textureObject->GetSamplerObject()->GetMagFilter()); + MG_Util::ConvertSamplerFilterModeToGLEnum(textureObject->GetSamplerObject()->GetMagFilter(), SamplerMipmapMode::None); } break; case GL_TEXTURE_MIN_FILTER: if (params) { *params = - MG_Util::ConvertSamplerFilterModeToGLEnum(textureObject->GetSamplerObject()->GetMinFilter()); + MG_Util::ConvertSamplerFilterModeToGLEnum(textureObject->GetSamplerObject()->GetMinFilter(), textureObject->GetSamplerObject()->GetMipmapMode()); } break; case GL_TEXTURE_MIN_LOD: @@ -554,13 +556,13 @@ namespace MobileGL { case GL_TEXTURE_MAG_FILTER: if (params) { *params = - MG_Util::ConvertSamplerFilterModeToGLEnum(textureObject->GetSamplerObject()->GetMagFilter()); + MG_Util::ConvertSamplerFilterModeToGLEnum(textureObject->GetSamplerObject()->GetMagFilter(), SamplerMipmapMode::None); } break; case GL_TEXTURE_MIN_FILTER: if (params) { *params = - MG_Util::ConvertSamplerFilterModeToGLEnum(textureObject->GetSamplerObject()->GetMinFilter()); + MG_Util::ConvertSamplerFilterModeToGLEnum(textureObject->GetSamplerObject()->GetMinFilter(), textureObject->GetSamplerObject()->GetMipmapMode()); } break; case GL_TEXTURE_MIN_LOD: diff --git a/MobileGL/MG_State/GLState/SamplerState/SamplerObject.h b/MobileGL/MG_State/GLState/SamplerState/SamplerObject.h index 756223f6..745663b2 100644 --- a/MobileGL/MG_State/GLState/SamplerState/SamplerObject.h +++ b/MobileGL/MG_State/GLState/SamplerState/SamplerObject.h @@ -12,6 +12,7 @@ namespace MobileGL { enum class SamplerMipmapMode { None, Nearest, + Linear, SamplerMipmapModeCount, Unknown = -1 }; diff --git a/MobileGL/MG_Util/Converters/GLToMG/TextureEnumConverter.cpp b/MobileGL/MG_Util/Converters/GLToMG/TextureEnumConverter.cpp index 99d36f88..dd51594d 100644 --- a/MobileGL/MG_Util/Converters/GLToMG/TextureEnumConverter.cpp +++ b/MobileGL/MG_Util/Converters/GLToMG/TextureEnumConverter.cpp @@ -316,20 +316,30 @@ namespace MobileGL { SamplerFilterMode ConvertGLEnumToSamplerFilterMode(GLenum v) { switch (v) { case GL_NEAREST: + case GL_NEAREST_MIPMAP_NEAREST: + case GL_NEAREST_MIPMAP_LINEAR: return SamplerFilterMode::Nearest; case GL_LINEAR: + case GL_LINEAR_MIPMAP_NEAREST: + case GL_LINEAR_MIPMAP_LINEAR: return SamplerFilterMode::Linear; default: + MGLOG_D("Unknown SamplerFilterMode %s", MG_Util::ConvertGLEnumToString(v).c_str()); return SamplerFilterMode::Unknown; } } SamplerMipmapMode ConvertGLEnumToSamplerMipmapMode(GLenum v) { switch (v) { - case 0: + case GL_NEAREST: + case GL_LINEAR: return SamplerMipmapMode::None; // 无 mipmap 时 case GL_NEAREST_MIPMAP_NEAREST: + case GL_LINEAR_MIPMAP_NEAREST: return SamplerMipmapMode::Nearest; + case GL_NEAREST_MIPMAP_LINEAR: + case GL_LINEAR_MIPMAP_LINEAR: + return SamplerMipmapMode::Linear; default: return SamplerMipmapMode::Unknown; } diff --git a/MobileGL/MG_Util/Converters/MGToGL/TextureEnumConverter.cpp b/MobileGL/MG_Util/Converters/MGToGL/TextureEnumConverter.cpp index 7ffe063a..17250f3a 100644 --- a/MobileGL/MG_Util/Converters/MGToGL/TextureEnumConverter.cpp +++ b/MobileGL/MG_Util/Converters/MGToGL/TextureEnumConverter.cpp @@ -307,14 +307,51 @@ namespace MobileGL { } } - GLenum ConvertSamplerFilterModeToGLEnum(SamplerFilterMode v) { - switch (v) { - case SamplerFilterMode::Nearest: - return GL_NEAREST; - case SamplerFilterMode::Linear: - return GL_LINEAR; - default: - return GL_UNKNOWN_MGL; +// GLenum ConvertSamplerFilterModeToGLEnum(SamplerFilterMode v) { +// switch (v) { +// case SamplerFilterMode::Nearest: +// return GL_NEAREST; +// case SamplerFilterMode::Linear: +// return GL_LINEAR; +// default: +// return GL_UNKNOWN_MGL; +// } +// } + + GLenum ConvertSamplerFilterModeToGLEnum(SamplerFilterMode filter, SamplerMipmapMode mipmap) { + switch (mipmap) { + case SamplerMipmapMode::None: { + switch (filter) { + case SamplerFilterMode::Nearest: + return GL_NEAREST; + case SamplerFilterMode::Linear: + return GL_LINEAR; + default: + return GL_UNKNOWN_MGL; + } + } + case SamplerMipmapMode::Nearest: { + switch (filter) { + case SamplerFilterMode::Nearest: + return GL_NEAREST_MIPMAP_NEAREST; + case SamplerFilterMode::Linear: + return GL_LINEAR_MIPMAP_NEAREST; + default: + return GL_UNKNOWN_MGL; + } + } + case SamplerMipmapMode::Linear: { + switch (filter) { + case SamplerFilterMode::Nearest: + return GL_NEAREST_MIPMAP_LINEAR; + case SamplerFilterMode::Linear: + return GL_LINEAR_MIPMAP_LINEAR; + default: + return GL_UNKNOWN_MGL; + } + } + default: + return GL_UNKNOWN_MGL; } } diff --git a/MobileGL/MG_Util/Converters/MGToGL/TextureEnumConverter.h b/MobileGL/MG_Util/Converters/MGToGL/TextureEnumConverter.h index 562aaddd..31adf091 100644 --- a/MobileGL/MG_Util/Converters/MGToGL/TextureEnumConverter.h +++ b/MobileGL/MG_Util/Converters/MGToGL/TextureEnumConverter.h @@ -9,8 +9,9 @@ namespace MobileGL { GLenum ConvertTextureInternalFormatToGLEnum(TextureInternalFormat internalformat); GLenum ConvertTexturePixelDataTypeToGLEnum(TexturePixelDataType type); GLenum ConvertTextureUploadTargetToGLEnum(TextureUploadTarget target); - GLenum ConvertSamplerFilterModeToGLEnum(SamplerFilterMode value); - GLenum ConvertSamplerMipmapModeToGLEnum(SamplerMipmapMode value); +// GLenum ConvertSamplerFilterModeToGLEnum(SamplerFilterMode value); +// GLenum ConvertSamplerMipmapModeToGLEnum(SamplerMipmapMode value); + GLenum ConvertSamplerFilterModeToGLEnum(SamplerFilterMode filter, SamplerMipmapMode mipmap); GLenum ConvertSamplerWrapModeToGLEnum(SamplerWrapMode value); GLenum ConvertSamplerCompareModeToGLEnum(SamplerCompareMode value); GLenum ConvertSamplerCompareFuncToGLEnum(SamplerCompareFunc value);