mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-09-08 20:28:32 +09:00
[Feat] (MG_Util/Converters, MG_State/Sampler, MG_State/Texture): properly implement min/mag/mip filters
This commit is contained in:
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<GLint>(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<GLint>(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<GLint*>(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<GLint>(mipmap.level), 0, 0,
|
||||
static_cast<GLsizei>(mipmap.size.x()),
|
||||
static_cast<GLsizei>(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)
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -12,6 +12,7 @@ namespace MobileGL {
|
||||
enum class SamplerMipmapMode {
|
||||
None,
|
||||
Nearest,
|
||||
Linear,
|
||||
SamplerMipmapModeCount,
|
||||
Unknown = -1
|
||||
};
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user