mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-09-12 14:18:31 +09:00
[Feat] (MG_Impl/Texture): implement GL_TEXTURE_SWIZZLE_RGBA
This commit is contained in:
@@ -20,6 +20,24 @@
|
|||||||
|
|
||||||
namespace MobileGL {
|
namespace MobileGL {
|
||||||
namespace MG_Impl::GLImpl {
|
namespace MG_Impl::GLImpl {
|
||||||
|
SharedPtr<MG_State::GLState::ITextureObject> GetTextureObjectByTarget(TextureUploadTarget textureUploadingTarget, TextureTarget textureTarget) {
|
||||||
|
SharedPtr<MG_State::GLState::ITextureObject> textureObject = nullptr;
|
||||||
|
if (TextureImpl::IsProxyTextureTarget(textureUploadingTarget)) {
|
||||||
|
textureObject =
|
||||||
|
TextureImpl::pProxyTextureManager->CreateOrReplaceProxyTextureObject(textureUploadingTarget);
|
||||||
|
} else {
|
||||||
|
auto activeUnit =
|
||||||
|
MG_State::pGLContext->GetTextureUnitObject(MG_State::pGLContext->GetActiveTextureUnit());
|
||||||
|
auto& bindingSlot = activeUnit.GetBindingSlot(textureTarget);
|
||||||
|
textureObject = bindingSlot.GetBoundObject();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!TextureImpl::ValidateTextureObject(textureObject))
|
||||||
|
return nullptr;
|
||||||
|
|
||||||
|
return textureObject;
|
||||||
|
}
|
||||||
|
|
||||||
void TexSubImage3D_State(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width,
|
void TexSubImage3D_State(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width,
|
||||||
GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* pixels) {
|
GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* pixels) {
|
||||||
// TODO: implement
|
// TODO: implement
|
||||||
@@ -147,18 +165,10 @@ namespace MobileGL {
|
|||||||
TextureTarget textureTarget = MG_Util::ConvertGLEnumToTextureTarget(target);
|
TextureTarget textureTarget = MG_Util::ConvertGLEnumToTextureTarget(target);
|
||||||
|
|
||||||
// ======================= Processing ================================
|
// ======================= Processing ================================
|
||||||
SharedPtr<MG_State::GLState::ITextureObject> textureObject = nullptr;
|
SharedPtr<MG_State::GLState::ITextureObject> textureObject =
|
||||||
if (TextureImpl::IsProxyTextureTarget(textureUploadingTarget)) {
|
GetTextureObjectByTarget(textureUploadingTarget, textureTarget);
|
||||||
textureObject =
|
if (!textureObject)
|
||||||
TextureImpl::pProxyTextureManager->CreateOrReplaceProxyTextureObject(textureUploadingTarget);
|
return;
|
||||||
} else {
|
|
||||||
auto activeUnit =
|
|
||||||
MG_State::pGLContext->GetTextureUnitObject(MG_State::pGLContext->GetActiveTextureUnit());
|
|
||||||
auto& bindingSlot = activeUnit.GetBindingSlot(textureTarget);
|
|
||||||
textureObject = bindingSlot.GetBoundObject();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!TextureImpl::ValidateTextureObject(textureObject)) return;
|
|
||||||
|
|
||||||
switch (pname) {
|
switch (pname) {
|
||||||
case GL_TEXTURE_MAG_FILTER:
|
case GL_TEXTURE_MAG_FILTER:
|
||||||
@@ -193,12 +203,6 @@ namespace MobileGL {
|
|||||||
textureObject->SetSwizzleParam(swizzleParam, swizzleValue);
|
textureObject->SetSwizzleParam(swizzleParam, swizzleValue);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GL_TEXTURE_SWIZZLE_RGBA:
|
|
||||||
// Not supported in this function
|
|
||||||
break;
|
|
||||||
case GL_TEXTURE_BORDER_COLOR:
|
|
||||||
// Not supported in this function
|
|
||||||
break;
|
|
||||||
case GL_TEXTURE_WRAP_S:
|
case GL_TEXTURE_WRAP_S:
|
||||||
textureObject->GetSamplerObject()->SetWrapS(MG_Util::ConvertGLEnumToSamplerWrapMode(param));
|
textureObject->GetSamplerObject()->SetWrapS(MG_Util::ConvertGLEnumToSamplerWrapMode(param));
|
||||||
break;
|
break;
|
||||||
@@ -215,6 +219,10 @@ namespace MobileGL {
|
|||||||
textureObject->GetSamplerObject()->SetSamplerCompareFunc(
|
textureObject->GetSamplerObject()->SetSamplerCompareFunc(
|
||||||
MG_Util::ConvertGLEnumToSamplerCompareFunc(param));
|
MG_Util::ConvertGLEnumToSamplerCompareFunc(param));
|
||||||
break;
|
break;
|
||||||
|
case GL_TEXTURE_SWIZZLE_RGBA:
|
||||||
|
// Not supported in this function
|
||||||
|
case GL_TEXTURE_BORDER_COLOR:
|
||||||
|
// Not supported in this function
|
||||||
default:
|
default:
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidEnum, MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "TexParameteri_State",
|
ErrorCode::InvalidEnum, MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "TexParameteri_State",
|
||||||
@@ -229,18 +237,10 @@ namespace MobileGL {
|
|||||||
TextureTarget textureTarget = MG_Util::ConvertGLEnumToTextureTarget(target);
|
TextureTarget textureTarget = MG_Util::ConvertGLEnumToTextureTarget(target);
|
||||||
|
|
||||||
// ======================= Processing ================================
|
// ======================= Processing ================================
|
||||||
SharedPtr<MG_State::GLState::ITextureObject> textureObject = nullptr;
|
SharedPtr<MG_State::GLState::ITextureObject> textureObject =
|
||||||
if (TextureImpl::IsProxyTextureTarget(textureUploadingTarget)) {
|
GetTextureObjectByTarget(textureUploadingTarget, textureTarget);
|
||||||
textureObject =
|
if (!textureObject)
|
||||||
TextureImpl::pProxyTextureManager->CreateOrReplaceProxyTextureObject(textureUploadingTarget);
|
return;
|
||||||
} else {
|
|
||||||
auto activeUnit =
|
|
||||||
MG_State::pGLContext->GetTextureUnitObject(MG_State::pGLContext->GetActiveTextureUnit());
|
|
||||||
auto& bindingSlot = activeUnit.GetBindingSlot(textureTarget);
|
|
||||||
textureObject = bindingSlot.GetBoundObject();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!TextureImpl::ValidateTextureObject(textureObject)) return;
|
|
||||||
|
|
||||||
switch (pname) {
|
switch (pname) {
|
||||||
case GL_TEXTURE_MAG_FILTER:
|
case GL_TEXTURE_MAG_FILTER:
|
||||||
@@ -275,12 +275,6 @@ namespace MobileGL {
|
|||||||
textureObject->SetSwizzleParam(swizzleParam, swizzleValue);
|
textureObject->SetSwizzleParam(swizzleParam, swizzleValue);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GL_TEXTURE_SWIZZLE_RGBA:
|
|
||||||
// Not supported in this function
|
|
||||||
break;
|
|
||||||
case GL_TEXTURE_BORDER_COLOR:
|
|
||||||
// Not supported in this function
|
|
||||||
break;
|
|
||||||
case GL_TEXTURE_WRAP_S:
|
case GL_TEXTURE_WRAP_S:
|
||||||
textureObject->GetSamplerObject()->SetWrapS(MG_Util::ConvertGLEnumToSamplerWrapMode(param));
|
textureObject->GetSamplerObject()->SetWrapS(MG_Util::ConvertGLEnumToSamplerWrapMode(param));
|
||||||
break;
|
break;
|
||||||
@@ -297,6 +291,10 @@ namespace MobileGL {
|
|||||||
textureObject->GetSamplerObject()->SetSamplerCompareFunc(
|
textureObject->GetSamplerObject()->SetSamplerCompareFunc(
|
||||||
MG_Util::ConvertGLEnumToSamplerCompareFunc(param));
|
MG_Util::ConvertGLEnumToSamplerCompareFunc(param));
|
||||||
break;
|
break;
|
||||||
|
case GL_TEXTURE_SWIZZLE_RGBA:
|
||||||
|
// Not supported in this function
|
||||||
|
case GL_TEXTURE_BORDER_COLOR:
|
||||||
|
// Not supported in this function
|
||||||
default:
|
default:
|
||||||
MG_State::pGLContext->RecordError(
|
MG_State::pGLContext->RecordError(
|
||||||
ErrorCode::InvalidEnum, MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "TexParameteri_State",
|
ErrorCode::InvalidEnum, MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", "TexParameteri_State",
|
||||||
@@ -310,11 +308,40 @@ namespace MobileGL {
|
|||||||
void TexParameterfv_State(GLenum target, GLenum pname, const GLfloat * params) {
|
void TexParameterfv_State(GLenum target, GLenum pname, const GLfloat * params) {
|
||||||
switch (pname) {
|
switch (pname) {
|
||||||
case GL_TEXTURE_BORDER_COLOR: {
|
case GL_TEXTURE_BORDER_COLOR: {
|
||||||
|
// ======================= Converting ================================
|
||||||
|
TextureUploadTarget textureUploadingTarget = MG_Util::ConvertGLEnumToTextureUploadTarget(target);
|
||||||
|
TextureTarget textureTarget = MG_Util::ConvertGLEnumToTextureTarget(target);
|
||||||
|
|
||||||
|
// ======================= Processing ================================
|
||||||
|
SharedPtr<MG_State::GLState::ITextureObject> textureObject =
|
||||||
|
GetTextureObjectByTarget(textureUploadingTarget, textureTarget);
|
||||||
|
if (!textureObject)
|
||||||
|
return;
|
||||||
THROW_UNIMPL_EXCEPTION;
|
THROW_UNIMPL_EXCEPTION;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GL_TEXTURE_SWIZZLE_RGBA: {
|
case GL_TEXTURE_SWIZZLE_RGBA: {
|
||||||
THROW_UNIMPL_EXCEPTION;
|
// ======================= Converting ================================
|
||||||
|
TextureUploadTarget textureUploadingTarget = MG_Util::ConvertGLEnumToTextureUploadTarget(target);
|
||||||
|
TextureTarget textureTarget = MG_Util::ConvertGLEnumToTextureTarget(target);
|
||||||
|
|
||||||
|
// ======================= Processing ================================
|
||||||
|
SharedPtr<MG_State::GLState::ITextureObject> textureObject =
|
||||||
|
GetTextureObjectByTarget(textureUploadingTarget, textureTarget);
|
||||||
|
if (!textureObject)
|
||||||
|
return;
|
||||||
|
|
||||||
|
Vec4<TextureSwizzleParam> swizzleParams;
|
||||||
|
for (int i = 0; i < 4; i++) {
|
||||||
|
swizzleParams[i] = MG_Util::ConvertGLEnumToTextureSwizzleParam(static_cast<GLint>(params[i]));
|
||||||
|
if (TextureSwizzleParam::Unknown == swizzleParams[i]) {
|
||||||
|
MG_State::pGLContext->RecordError(
|
||||||
|
ErrorCode::InvalidEnum, MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
||||||
|
"`params` is not valid."));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
textureObject->SetSwizzleParamRGBA(swizzleParams);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
@@ -326,11 +353,41 @@ namespace MobileGL {
|
|||||||
void TexParameteriv_State(GLenum target, GLenum pname, const GLint * params) {
|
void TexParameteriv_State(GLenum target, GLenum pname, const GLint * params) {
|
||||||
switch (pname) {
|
switch (pname) {
|
||||||
case GL_TEXTURE_BORDER_COLOR: {
|
case GL_TEXTURE_BORDER_COLOR: {
|
||||||
|
// ======================= Converting ================================
|
||||||
|
TextureUploadTarget textureUploadingTarget = MG_Util::ConvertGLEnumToTextureUploadTarget(target);
|
||||||
|
TextureTarget textureTarget = MG_Util::ConvertGLEnumToTextureTarget(target);
|
||||||
|
|
||||||
|
// ======================= Processing ================================
|
||||||
|
SharedPtr<MG_State::GLState::ITextureObject> textureObject =
|
||||||
|
GetTextureObjectByTarget(textureUploadingTarget, textureTarget);
|
||||||
|
if (!textureObject)
|
||||||
|
return;
|
||||||
|
|
||||||
THROW_UNIMPL_EXCEPTION;
|
THROW_UNIMPL_EXCEPTION;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GL_TEXTURE_SWIZZLE_RGBA: {
|
case GL_TEXTURE_SWIZZLE_RGBA: {
|
||||||
THROW_UNIMPL_EXCEPTION;
|
// ======================= Converting ================================
|
||||||
|
TextureUploadTarget textureUploadingTarget = MG_Util::ConvertGLEnumToTextureUploadTarget(target);
|
||||||
|
TextureTarget textureTarget = MG_Util::ConvertGLEnumToTextureTarget(target);
|
||||||
|
|
||||||
|
// ======================= Processing ================================
|
||||||
|
SharedPtr<MG_State::GLState::ITextureObject> textureObject =
|
||||||
|
GetTextureObjectByTarget(textureUploadingTarget, textureTarget);
|
||||||
|
if (!textureObject)
|
||||||
|
return;
|
||||||
|
|
||||||
|
Vec4<TextureSwizzleParam> swizzleParams;
|
||||||
|
for (int i = 0; i < 4; i++) {
|
||||||
|
swizzleParams[i] = MG_Util::ConvertGLEnumToTextureSwizzleParam(static_cast<GLint>(params[i]));
|
||||||
|
if (TextureSwizzleParam::Unknown == swizzleParams[i]) {
|
||||||
|
MG_State::pGLContext->RecordError(
|
||||||
|
ErrorCode::InvalidEnum, MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
||||||
|
"`params` is not valid."));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
textureObject->SetSwizzleParamRGBA(swizzleParams);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
@@ -346,7 +403,27 @@ namespace MobileGL {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GL_TEXTURE_SWIZZLE_RGBA: {
|
case GL_TEXTURE_SWIZZLE_RGBA: {
|
||||||
THROW_UNIMPL_EXCEPTION;
|
// ======================= Converting ================================
|
||||||
|
TextureUploadTarget textureUploadingTarget = MG_Util::ConvertGLEnumToTextureUploadTarget(target);
|
||||||
|
TextureTarget textureTarget = MG_Util::ConvertGLEnumToTextureTarget(target);
|
||||||
|
|
||||||
|
// ======================= Processing ================================
|
||||||
|
SharedPtr<MG_State::GLState::ITextureObject> textureObject =
|
||||||
|
GetTextureObjectByTarget(textureUploadingTarget, textureTarget);
|
||||||
|
if (!textureObject)
|
||||||
|
return;
|
||||||
|
|
||||||
|
Vec4<TextureSwizzleParam> swizzleParams;
|
||||||
|
for (int i = 0; i < 4; i++) {
|
||||||
|
swizzleParams[i] = MG_Util::ConvertGLEnumToTextureSwizzleParam(static_cast<GLint>(params[i]));
|
||||||
|
if (TextureSwizzleParam::Unknown == swizzleParams[i]) {
|
||||||
|
MG_State::pGLContext->RecordError(
|
||||||
|
ErrorCode::InvalidEnum, MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
||||||
|
"`params` is not valid."));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
textureObject->SetSwizzleParamRGBA(swizzleParams);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
@@ -362,7 +439,27 @@ namespace MobileGL {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GL_TEXTURE_SWIZZLE_RGBA: {
|
case GL_TEXTURE_SWIZZLE_RGBA: {
|
||||||
THROW_UNIMPL_EXCEPTION;
|
// ======================= Converting ================================
|
||||||
|
TextureUploadTarget textureUploadingTarget = MG_Util::ConvertGLEnumToTextureUploadTarget(target);
|
||||||
|
TextureTarget textureTarget = MG_Util::ConvertGLEnumToTextureTarget(target);
|
||||||
|
|
||||||
|
// ======================= Processing ================================
|
||||||
|
SharedPtr<MG_State::GLState::ITextureObject> textureObject =
|
||||||
|
GetTextureObjectByTarget(textureUploadingTarget, textureTarget);
|
||||||
|
if (!textureObject)
|
||||||
|
return;
|
||||||
|
|
||||||
|
Vec4<TextureSwizzleParam> swizzleParams;
|
||||||
|
for (int i = 0; i < 4; i++) {
|
||||||
|
swizzleParams[i] = MG_Util::ConvertGLEnumToTextureSwizzleParam(static_cast<GLint>(params[i]));
|
||||||
|
if (TextureSwizzleParam::Unknown == swizzleParams[i]) {
|
||||||
|
MG_State::pGLContext->RecordError(
|
||||||
|
ErrorCode::InvalidEnum, MakeShared<GenericErrorInfo>("MG_Impl/GLImpl", __func__,
|
||||||
|
"`params` is not valid."));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
textureObject->SetSwizzleParamRGBA(swizzleParams);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
|||||||
@@ -91,6 +91,9 @@ namespace MobileGL {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
void TextureObjectBase::SetSwizzleParamRGBA(const Vec4<TextureSwizzleParam>& values) {
|
||||||
|
m_swizzleParams = values;
|
||||||
|
}
|
||||||
|
|
||||||
const UintVec2& TextureObjectBase::GetLevelRange() const {
|
const UintVec2& TextureObjectBase::GetLevelRange() const {
|
||||||
return m_levelRange;
|
return m_levelRange;
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ namespace MobileGL {
|
|||||||
virtual void SetBorderColor(const FloatVec4& color) = 0;
|
virtual void SetBorderColor(const FloatVec4& color) = 0;
|
||||||
virtual TextureSwizzleParam GetSwizzleParam(TextureSwizzleParam param) const = 0;
|
virtual TextureSwizzleParam GetSwizzleParam(TextureSwizzleParam param) const = 0;
|
||||||
virtual void SetSwizzleParam(TextureSwizzleParam param, TextureSwizzleParam value) = 0;
|
virtual void SetSwizzleParam(TextureSwizzleParam param, TextureSwizzleParam value) = 0;
|
||||||
|
virtual void SetSwizzleParamRGBA(const Vec4<TextureSwizzleParam>& values) = 0;
|
||||||
virtual const Vec4<TextureSwizzleParam>& GetAllSwizzleParams() const = 0;
|
virtual const Vec4<TextureSwizzleParam>& GetAllSwizzleParams() const = 0;
|
||||||
virtual const UintVec2& GetLevelRange() const = 0;
|
virtual const UintVec2& GetLevelRange() const = 0;
|
||||||
virtual void SetBaseLevel(Uint baseLevel) = 0;
|
virtual void SetBaseLevel(Uint baseLevel) = 0;
|
||||||
@@ -54,6 +55,7 @@ namespace MobileGL {
|
|||||||
TextureSwizzleParam GetSwizzleParam(TextureSwizzleParam param) const override;
|
TextureSwizzleParam GetSwizzleParam(TextureSwizzleParam param) const override;
|
||||||
const Vec4<TextureSwizzleParam>& GetAllSwizzleParams() const override;
|
const Vec4<TextureSwizzleParam>& GetAllSwizzleParams() const override;
|
||||||
void SetSwizzleParam(TextureSwizzleParam param, TextureSwizzleParam value) override;
|
void SetSwizzleParam(TextureSwizzleParam param, TextureSwizzleParam value) override;
|
||||||
|
void SetSwizzleParamRGBA(const Vec4<TextureSwizzleParam>& values) override;
|
||||||
const UintVec2& GetLevelRange() const override;
|
const UintVec2& GetLevelRange() const override;
|
||||||
void SetBaseLevel(Uint baseLevel) override;
|
void SetBaseLevel(Uint baseLevel) override;
|
||||||
void SetMaxLevel(Uint maxLevel) override;
|
void SetMaxLevel(Uint maxLevel) override;
|
||||||
|
|||||||
Reference in New Issue
Block a user