From 60bb0919273c5eb528d3bba97881516fa7b86910 Mon Sep 17 00:00:00 2001 From: BZLZHH Date: Sun, 16 Nov 2025 00:36:21 +0800 Subject: [PATCH] [Feat] (MG_Impl/Sampler): Implement full sampler object frontend. --- CMakeLists.txt | 2 + .../MG_Impl/GLImpl/Exporting/Definitions.cpp | 35 +-- .../MG_Impl/GLImpl/Sampler/GL_Sampler.cpp | 248 ++++++++++++++++++ MobileGL/MG_Impl/GLImpl/Sampler/GL_Sampler.h | 24 ++ .../MG_Impl/GLImpl/Sampler/Validators.cpp | 128 +++++++++ MobileGL/MG_Impl/GLImpl/Sampler/Validators.h | 13 + 6 files changed, 433 insertions(+), 17 deletions(-) create mode 100644 MobileGL/MG_Impl/GLImpl/Sampler/GL_Sampler.cpp create mode 100644 MobileGL/MG_Impl/GLImpl/Sampler/GL_Sampler.h create mode 100644 MobileGL/MG_Impl/GLImpl/Sampler/Validators.cpp create mode 100644 MobileGL/MG_Impl/GLImpl/Sampler/Validators.h diff --git a/CMakeLists.txt b/CMakeLists.txt index a353fd77..db0a77ac 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -102,6 +102,8 @@ set(SOURCE_FILES MobileGL/MG_Impl/EGLImpl/EGLWrapper/EGLWrapper.cpp # @INSERTION_POINT:SOURCE_FILE_GLIMPL@ # + MobileGL/MG_Impl/GLImpl/Sampler/Validators.cpp + MobileGL/MG_Impl/GLImpl/Sampler/GL_Sampler.cpp MobileGL/MG_Impl/GLImpl/Drawing/GL_Drawing.cpp MobileGL/MG_Impl/GLImpl/RenderState/GL_RenderState.cpp MobileGL/MG_Impl/GLImpl/Framebuffer/Validators.cpp diff --git a/MobileGL/MG_Impl/GLImpl/Exporting/Definitions.cpp b/MobileGL/MG_Impl/GLImpl/Exporting/Definitions.cpp index cf7884db..31434672 100644 --- a/MobileGL/MG_Impl/GLImpl/Exporting/Definitions.cpp +++ b/MobileGL/MG_Impl/GLImpl/Exporting/Definitions.cpp @@ -1,9 +1,10 @@ #include #include "../Buffer/GL_Buffer.h" #include "../Getter/GL_Getter.h" -#include "../Program/GL_Program.h" +#include "../Sampler/GL_Sampler.h" #include "../Texture/GL_Texture.h" #include "../Drawing/GL_Drawing.h" +#include "../Program/GL_Program.h" #include "../RenderState/GL_RenderState.h" #include "../Framebuffer/GL_Framebuffer.h" #include "../VertexArray/GL_VertexArray.h" @@ -256,16 +257,16 @@ DECLARE_GL_FUNCTION_STUB_HEAD(void, GetInteger64v, GLenum pname, GLint64* data) DECLARE_GL_FUNCTION_STUB_HEAD(void, GetSynciv, GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, GetSynciv, sync, pname, bufSize, length, values) DECLARE_GL_FUNCTION_STUB_HEAD(void, GetInteger64i_v, GLenum target, GLuint index, GLint64* data) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, GetInteger64i_v, target, index, data) DECLARE_GL_FUNCTION_STUB_HEAD(void, GetBufferParameteri64v, GLenum target, GLenum pname, GLint64* params) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, GetBufferParameteri64v, target, pname, params) -DECLARE_GL_FUNCTION_STUB_HEAD(void, GenSamplers, GLsizei count, GLuint* samplers) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, GenSamplers, count, samplers) -DECLARE_GL_FUNCTION_STUB_HEAD(void, DeleteSamplers, GLsizei count, const GLuint* samplers) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, DeleteSamplers, count, samplers) -DECLARE_GL_FUNCTION_STUB_HEAD(GLboolean, IsSampler, GLuint sampler) DECLARE_GL_FUNCTION_STUB_END(GLboolean, IsSampler, sampler) -DECLARE_GL_FUNCTION_STUB_HEAD(void, BindSampler, GLuint unit, GLuint sampler) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, BindSampler, unit, sampler) -DECLARE_GL_FUNCTION_STUB_HEAD(void, SamplerParameteri, GLuint sampler, GLenum pname, GLint param) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, SamplerParameteri, sampler, pname, param) -DECLARE_GL_FUNCTION_STUB_HEAD(void, SamplerParameteriv, GLuint sampler, GLenum pname, const GLint* param) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, SamplerParameteriv, sampler, pname, param) -DECLARE_GL_FUNCTION_STUB_HEAD(void, SamplerParameterf, GLuint sampler, GLenum pname, GLfloat param) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, SamplerParameterf, sampler, pname, param) -DECLARE_GL_FUNCTION_STUB_HEAD(void, SamplerParameterfv, GLuint sampler, GLenum pname, const GLfloat* param) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, SamplerParameterfv, sampler, pname, param) -DECLARE_GL_FUNCTION_STUB_HEAD(void, GetSamplerParameteriv, GLuint sampler, GLenum pname, GLint* params) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, GetSamplerParameteriv, sampler, pname, params) -DECLARE_GL_FUNCTION_STUB_HEAD(void, GetSamplerParameterfv, GLuint sampler, GLenum pname, GLfloat* params) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, GetSamplerParameterfv, sampler, pname, params) +DECLARE_GL_FUNCTION_HEAD(void, GenSamplers, GLsizei count, GLuint* samplers) DECLARE_GL_FUNCTION_END_NO_RETURN(void, GenSamplers, count, samplers) +DECLARE_GL_FUNCTION_HEAD(void, DeleteSamplers, GLsizei count, const GLuint* samplers) DECLARE_GL_FUNCTION_END_NO_RETURN(void, DeleteSamplers, count, samplers) +DECLARE_GL_FUNCTION_HEAD(GLboolean, IsSampler, GLuint sampler) DECLARE_GL_FUNCTION_END(GLboolean, IsSampler, sampler) +DECLARE_GL_FUNCTION_HEAD(void, BindSampler, GLuint unit, GLuint sampler) DECLARE_GL_FUNCTION_END_NO_RETURN(void, BindSampler, unit, sampler) +DECLARE_GL_FUNCTION_HEAD(void, SamplerParameteri, GLuint sampler, GLenum pname, GLint param) DECLARE_GL_FUNCTION_END_NO_RETURN(void, SamplerParameteri, sampler, pname, param) +DECLARE_GL_FUNCTION_HEAD(void, SamplerParameteriv, GLuint sampler, GLenum pname, const GLint* param) DECLARE_GL_FUNCTION_END_NO_RETURN(void, SamplerParameteriv, sampler, pname, param) +DECLARE_GL_FUNCTION_HEAD(void, SamplerParameterf, GLuint sampler, GLenum pname, GLfloat param) DECLARE_GL_FUNCTION_END_NO_RETURN(void, SamplerParameterf, sampler, pname, param) +DECLARE_GL_FUNCTION_HEAD(void, SamplerParameterfv, GLuint sampler, GLenum pname, const GLfloat* param) DECLARE_GL_FUNCTION_END_NO_RETURN(void, SamplerParameterfv, sampler, pname, param) +DECLARE_GL_FUNCTION_HEAD(void, GetSamplerParameteriv, GLuint sampler, GLenum pname, GLint* params) DECLARE_GL_FUNCTION_END_NO_RETURN(void, GetSamplerParameteriv, sampler, pname, params) +DECLARE_GL_FUNCTION_HEAD(void, GetSamplerParameterfv, GLuint sampler, GLenum pname, GLfloat* params) DECLARE_GL_FUNCTION_END_NO_RETURN(void, GetSamplerParameterfv, sampler, pname, params) DECLARE_GL_FUNCTION_STUB_HEAD(void, VertexAttribDivisor, GLuint index, GLuint divisor) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, VertexAttribDivisor, index, divisor) DECLARE_GL_FUNCTION_STUB_HEAD(void, BindTransformFeedback, GLenum target, GLuint id) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, BindTransformFeedback, target, id) DECLARE_GL_FUNCTION_STUB_HEAD(void, DeleteTransformFeedbacks, GLsizei n, const GLuint* ids) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, DeleteTransformFeedbacks, n, ids) @@ -386,10 +387,10 @@ DECLARE_GL_FUNCTION_STUB_HEAD(void, TexParameterIiv, GLenum target, GLenum pname DECLARE_GL_FUNCTION_STUB_HEAD(void, TexParameterIuiv, GLenum target, GLenum pname, const GLuint* params) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, TexParameterIuiv, target, pname, params) DECLARE_GL_FUNCTION_HEAD(void, GetTexParameterIiv, GLenum target, GLenum pname, GLint* params) DECLARE_GL_FUNCTION_END_NO_RETURN(void, GetTexParameterIiv, target, pname, params) DECLARE_GL_FUNCTION_HEAD(void, GetTexParameterIuiv, GLenum target, GLenum pname, GLuint* params) DECLARE_GL_FUNCTION_END_NO_RETURN(void, GetTexParameterIuiv, target, pname, params) -DECLARE_GL_FUNCTION_STUB_HEAD(void, SamplerParameterIiv, GLuint sampler, GLenum pname, const GLint* param) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, SamplerParameterIiv, sampler, pname, param) -DECLARE_GL_FUNCTION_STUB_HEAD(void, SamplerParameterIuiv, GLuint sampler, GLenum pname, const GLuint* param) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, SamplerParameterIuiv, sampler, pname, param) -DECLARE_GL_FUNCTION_STUB_HEAD(void, GetSamplerParameterIiv, GLuint sampler, GLenum pname, GLint* params) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, GetSamplerParameterIiv, sampler, pname, params) -DECLARE_GL_FUNCTION_STUB_HEAD(void, GetSamplerParameterIuiv, GLuint sampler, GLenum pname, GLuint* params) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, GetSamplerParameterIuiv, sampler, pname, params) +DECLARE_GL_FUNCTION_HEAD(void, SamplerParameterIiv, GLuint sampler, GLenum pname, const GLint* param) DECLARE_GL_FUNCTION_END_NO_RETURN(void, SamplerParameterIiv, sampler, pname, param) +DECLARE_GL_FUNCTION_HEAD(void, SamplerParameterIuiv, GLuint sampler, GLenum pname, const GLuint* param) DECLARE_GL_FUNCTION_END_NO_RETURN(void, SamplerParameterIuiv, sampler, pname, param) +DECLARE_GL_FUNCTION_HEAD(void, GetSamplerParameterIiv, GLuint sampler, GLenum pname, GLint* params) DECLARE_GL_FUNCTION_END_NO_RETURN(void, GetSamplerParameterIiv, sampler, pname, params) +DECLARE_GL_FUNCTION_HEAD(void, GetSamplerParameterIuiv, GLuint sampler, GLenum pname, GLuint* params) DECLARE_GL_FUNCTION_END_NO_RETURN(void, GetSamplerParameterIuiv, sampler, pname, params) DECLARE_GL_FUNCTION_HEAD(void, TexBuffer, GLenum target, GLenum internalformat, GLuint buffer) DECLARE_GL_FUNCTION_END_NO_RETURN(void, TexBuffer, target, internalformat, buffer) DECLARE_GL_FUNCTION_STUB_HEAD(void, TexBufferRange, GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, TexBufferRange, target, internalformat, buffer, offset, size) DECLARE_GL_FUNCTION_STUB_HEAD(void, TexStorage3DMultisample, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, TexStorage3DMultisample, target, samples, internalformat, width, height, depth, fixedsamplelocations) @@ -960,7 +961,7 @@ DECLARE_GL_FUNCTION_STUB_HEAD(void, ClearTexSubImage, GLuint texture, GLint leve DECLARE_GL_FUNCTION_STUB_HEAD(void, BindBuffersBase, GLenum target, GLuint first, GLsizei count, const GLuint* buffers) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, BindBuffersBase, target, first, count, buffers) DECLARE_GL_FUNCTION_STUB_HEAD(void, BindBuffersRange, GLenum target, GLuint first, GLsizei count, const GLuint* buffers, const GLintptr* offsets, const GLsizeiptr* sizes) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, BindBuffersRange, target, first, count, buffers, offsets, sizes) DECLARE_GL_FUNCTION_STUB_HEAD(void, BindTextures, GLuint first, GLsizei count, const GLuint* textures) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, BindTextures, first, count, textures) -DECLARE_GL_FUNCTION_STUB_HEAD(void, BindSamplers, GLuint first, GLsizei count, const GLuint* samplers) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, BindSamplers, first, count, samplers) +DECLARE_GL_FUNCTION_HEAD(void, BindSamplers, GLuint first, GLsizei count, const GLuint* samplers) DECLARE_GL_FUNCTION_END_NO_RETURN(void, BindSamplers, first, count, samplers) DECLARE_GL_FUNCTION_STUB_HEAD(void, BindImageTextures, GLuint first, GLsizei count, const GLuint* textures) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, BindImageTextures, first, count, textures) DECLARE_GL_FUNCTION_STUB_HEAD(void, BindVertexBuffers, GLuint first, GLsizei count, const GLuint* buffers, const GLintptr* offsets, const GLsizei* strides) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, BindVertexBuffers, first, count, buffers, offsets, strides) DECLARE_GL_FUNCTION_STUB_HEAD(void, ClipControl, GLenum origin, GLenum depth) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, ClipControl, origin, depth) @@ -1052,7 +1053,7 @@ DECLARE_GL_FUNCTION_STUB_HEAD(void, VertexArrayBindingDivisor, GLuint vaobj, GLu DECLARE_GL_FUNCTION_STUB_HEAD(void, GetVertexArrayiv, GLuint vaobj, GLenum pname, GLint* param) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, GetVertexArrayiv, vaobj, pname, param) DECLARE_GL_FUNCTION_STUB_HEAD(void, GetVertexArrayIndexediv, GLuint vaobj, GLuint index, GLenum pname, GLint* param) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, GetVertexArrayIndexediv, vaobj, index, pname, param) DECLARE_GL_FUNCTION_STUB_HEAD(void, GetVertexArrayIndexed64iv, GLuint vaobj, GLuint index, GLenum pname, GLint64* param) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, GetVertexArrayIndexed64iv, vaobj, index, pname, param) -DECLARE_GL_FUNCTION_STUB_HEAD(void, CreateSamplers, GLsizei n, GLuint* samplers) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, CreateSamplers, n, samplers) +DECLARE_GL_FUNCTION_HEAD(void, CreateSamplers, GLsizei n, GLuint* samplers) DECLARE_GL_FUNCTION_END_NO_RETURN(void, CreateSamplers, n, samplers) DECLARE_GL_FUNCTION_STUB_HEAD(void, CreateProgramPipelines, GLsizei n, GLuint* pipelines) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, CreateProgramPipelines, n, pipelines) DECLARE_GL_FUNCTION_STUB_HEAD(void, CreateQueries, GLenum target, GLsizei n, GLuint* ids) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, CreateQueries, target, n, ids) DECLARE_GL_FUNCTION_STUB_HEAD(void, GetQueryBufferObjecti64v, GLuint id, GLuint buffer, GLenum pname, GLintptr offset) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, GetQueryBufferObjecti64v, id, buffer, pname, offset) diff --git a/MobileGL/MG_Impl/GLImpl/Sampler/GL_Sampler.cpp b/MobileGL/MG_Impl/GLImpl/Sampler/GL_Sampler.cpp new file mode 100644 index 00000000..ad4eb704 --- /dev/null +++ b/MobileGL/MG_Impl/GLImpl/Sampler/GL_Sampler.cpp @@ -0,0 +1,248 @@ +#include "GL_Sampler.h" +#include "Validators.h" +#include +#include +#include + +namespace MobileGL { + namespace MG_Impl::GLImpl { + void SetSamplerParam_State(GLuint sampler, GLenum pname, const void* param, bool isFloat, bool isInteger) { + if (!SamplerImpl::ValidateSamplerName(sampler)) return; + + auto samplerObj = MG_State::pGLContext->GetSamplerObject(sampler); + if (!SamplerImpl::ValidateSamplerObject(sampler)) return; + + using namespace MG_Util; + switch (pname) { + case GL_TEXTURE_WRAP_S: + samplerObj->SetWrapS(MG_Util::ConvertGLEnumToSamplerWrapMode(*(const GLint*)param)); + break; + case GL_TEXTURE_WRAP_T: + samplerObj->SetWrapT(MG_Util::ConvertGLEnumToSamplerWrapMode(*(const GLint*)param)); + break; + case GL_TEXTURE_WRAP_R: + samplerObj->SetWrapR(MG_Util::ConvertGLEnumToSamplerWrapMode(*(const GLint*)param)); + break; + case GL_TEXTURE_MIN_FILTER: + samplerObj->SetMinFilter(MG_Util::ConvertGLEnumToSamplerFilterMode(*(const GLint*)param)); + break; + case GL_TEXTURE_MAG_FILTER: + samplerObj->SetMagFilter(MG_Util::ConvertGLEnumToSamplerFilterMode(*(const GLint*)param)); + break; + case GL_TEXTURE_MIN_LOD: + samplerObj->SetLodRange(*(const GLfloat*)param, samplerObj->GetMaxLod()); + break; + case GL_TEXTURE_MAX_LOD: + samplerObj->SetLodRange(samplerObj->GetMinLod(), *(const GLfloat*)param); + break; + case GL_TEXTURE_LOD_BIAS: + samplerObj->SetLodBias(*(const GLfloat*)param); + break; + case GL_TEXTURE_COMPARE_MODE: + samplerObj->SetCompareMode(MG_Util::ConvertGLEnumToSamplerCompareMode(*(const GLint*)param)); + break; + case GL_TEXTURE_COMPARE_FUNC: + samplerObj->SetSamplerCompareFunc(MG_Util::ConvertGLEnumToSamplerCompareFunc(*(const GLint*)param)); + break; + default: + MG_State::pGLContext->RecordError( + ErrorCode::InvalidEnum, MakeShared("MG_Impl/GLImpl", "SetSamplerParam_State", + "Invalid pname for sampler parameter")); + } + } + + void GetSamplerParam_State(GLuint sampler, GLenum pname, void* params, bool isFloat, bool isInteger) { + if (!SamplerImpl::ValidateSamplerName(sampler)) return; + + auto samplerObj = MG_State::pGLContext->GetSamplerObject(sampler); + if (!SamplerImpl::ValidateSamplerObject(sampler)) return; + + using namespace MG_Util; + switch (pname) { + case GL_TEXTURE_WRAP_S: + *(GLint*)params = MG_Util::ConvertSamplerWrapModeToGLEnum(samplerObj->GetWrapS()); + break; + case GL_TEXTURE_WRAP_T: + *(GLint*)params = MG_Util::ConvertSamplerWrapModeToGLEnum(samplerObj->GetWrapT()); + break; + case GL_TEXTURE_WRAP_R: + *(GLint*)params = MG_Util::ConvertSamplerWrapModeToGLEnum(samplerObj->GetWrapR()); + break; + case GL_TEXTURE_MIN_FILTER: + *(GLint*)params = MG_Util::ConvertSamplerFilterModeToGLEnum(samplerObj->GetMinFilter()); + break; + case GL_TEXTURE_MAG_FILTER: + *(GLint*)params = MG_Util::ConvertSamplerFilterModeToGLEnum(samplerObj->GetMagFilter()); + break; + case GL_TEXTURE_MIN_LOD: + *(GLfloat*)params = samplerObj->GetMinLod(); + break; + case GL_TEXTURE_MAX_LOD: + *(GLfloat*)params = samplerObj->GetMaxLod(); + break; + case GL_TEXTURE_LOD_BIAS: + *(GLfloat*)params = samplerObj->GetLodBias(); + break; + case GL_TEXTURE_COMPARE_MODE: + *(GLint*)params = MG_Util::ConvertSamplerCompareModeToGLEnum(samplerObj->GetCompareMode()); + break; + case GL_TEXTURE_COMPARE_FUNC: + *(GLint*)params = MG_Util::ConvertSamplerCompareFuncToGLEnum(samplerObj->GetSamplerCompareFunc()); + break; + default: + MG_State::pGLContext->RecordError( + ErrorCode::InvalidEnum, MakeShared("MG_Impl/GLImpl", "GetSamplerParam_State", + "Invalid pname for sampler parameter")); + } + } + + GLboolean IsSampler_State(GLuint sampler) { + return MG_State::pGLContext->ValidateSamplerObject(sampler) ? GL_TRUE : GL_FALSE; + } + + // migrate below functions without "_State" into this section + void GenSamplers_State(GLsizei count, GLuint* samplers) { + if (count < 0) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidValue, + MakeShared("MG_Impl/GLImpl", "GenSamplers", "count must be non-negative")); + return; + } + + auto names = MG_State::pGLContext->GenSamplerNames(count); + for (GLsizei i = 0; i < count; ++i) { + samplers[i] = names[i]; + } + } + + void DeleteSamplers_State(GLsizei count, const GLuint* samplers) { + if (count < 0) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidValue, + MakeShared("MG_Impl/GLImpl", "DeleteSamplers", "count must be non-negative")); + return; + } + + for (GLsizei i = 0; i < count; ++i) { + if (samplers[i] != 0) { + MG_State::pGLContext->MarkSamplerObjectForDeletion(samplers[i]); + } + } + } + + void CreateSamplers_State(GLsizei n, GLuint* samplers) { + if (n < 0) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidValue, + MakeShared("MG_Impl/GLImpl", "GenSamplers", "count must be non-negative")); + return; + } + + auto names = MG_State::pGLContext->GenSamplerNames(n); + for (GLsizei i = 0; i < n; ++i) { + samplers[i] = names[i]; + MG_State::pGLContext->CreateSamplerObject(names[i]); + } + } + + void BindSampler_State(GLuint unit, GLuint sampler) { + if (unit >= MG_State::GLState::TextureState::MAX_TEXTURE_IMAGE_UNITS) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidValue, + MakeShared("MG_Impl/GLImpl", "BindSampler", "texture unit out of range")); + return; + } + + auto& textureUnit = MG_State::pGLContext->GetTextureUnitObject(unit); + if (sampler == 0) { + textureUnit.SetSamplerObject(nullptr); + } else { + if (!SamplerImpl::ValidateSamplerName(sampler)) return; + auto samplerObject = MG_State::pGLContext->GetSamplerObject(sampler); + if (!samplerObject) { + samplerObject = MG_State::pGLContext->CreateSamplerObject(sampler); + } + + textureUnit.SetSamplerObject(MG_State::pGLContext->GetSamplerObject(sampler)); + } + } + + void BindSamplers_State(GLuint first, GLsizei count, const GLuint* samplers) { + if (count < 0) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidValue, + MakeShared("MG_Impl/GLImpl", "BindSamplers", "count must be non-negative")); + return; + } + + for (GLsizei i = 0; i < count; ++i) { + BindSampler_State(first + i, samplers ? samplers[i] : 0); + } + } + + /* @INSERTION_POINT:FUNCTION_IMPLEMENTATION@ */ + void GetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params) { + GetSamplerParam_State(sampler, pname, params, false, false); + } + + void SamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint* param) { + SetSamplerParam_State(sampler, pname, param, false, true); + } + + void SamplerParameterIiv(GLuint sampler, GLenum pname, const GLint* param) { + SetSamplerParam_State(sampler, pname, param, false, true); + } + + void SamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param) { + SetSamplerParam_State(sampler, pname, param, false, false); + } + + void SamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param) { + SetSamplerParam_State(sampler, pname, param, true, false); + } + + void SamplerParameteri(GLuint sampler, GLenum pname, GLint param) { + SamplerParameteriv(sampler, pname, ¶m); + } + + void SamplerParameterf(GLuint sampler, GLenum pname, GLfloat param) { + SamplerParameterfv(sampler, pname, ¶m); + } + + GLboolean IsSampler(GLuint sampler) { + return IsSampler_State(sampler); + } + + void GetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint* params) { + GetSamplerParam_State(sampler, pname, params, false, true); + } + + void GetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint* params) { + GetSamplerParam_State(sampler, pname, params, false, true); + } + + void GetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params) { + GetSamplerParam_State(sampler, pname, params, true, false); + } + + void GenSamplers(GLsizei count, GLuint* samplers) { + GenSamplers_State(count, samplers); + } + + void DeleteSamplers(GLsizei count, const GLuint* samplers) { + DeleteSamplers_State(count, samplers); + } + + void CreateSamplers(GLsizei n, GLuint* samplers) { + CreateSamplers_State(n, samplers); + } + + void BindSamplers(GLuint first, GLsizei count, const GLuint* samplers) { + BindSamplers_State(first, count, samplers); + } + + void BindSampler(GLuint unit, GLuint sampler) { + BindSampler_State(unit, sampler); + } + } // namespace MG_Impl::GLImpl +} // namespace MobileGL diff --git a/MobileGL/MG_Impl/GLImpl/Sampler/GL_Sampler.h b/MobileGL/MG_Impl/GLImpl/Sampler/GL_Sampler.h new file mode 100644 index 00000000..d767d269 --- /dev/null +++ b/MobileGL/MG_Impl/GLImpl/Sampler/GL_Sampler.h @@ -0,0 +1,24 @@ +#pragma once +#include + +namespace MobileGL { + namespace MG_Impl::GLImpl { + /* @INSERTION_POINT:FUNCTION_DECLARATION@ */ + void GetSamplerParameteriv(GLuint sampler, GLenum pname, GLint* params); + void SamplerParameterIuiv(GLuint sampler, GLenum pname, const GLuint* param); + void SamplerParameterIiv(GLuint sampler, GLenum pname, const GLint* param); + void SamplerParameteriv(GLuint sampler, GLenum pname, const GLint* param); + void SamplerParameterfv(GLuint sampler, GLenum pname, const GLfloat* param); + void SamplerParameteri(GLuint sampler, GLenum pname, GLint param); + void SamplerParameterf(GLuint sampler, GLenum pname, GLfloat param); + GLboolean IsSampler(GLuint sampler); + void GetSamplerParameterIuiv(GLuint sampler, GLenum pname, GLuint* params); + void GetSamplerParameterIiv(GLuint sampler, GLenum pname, GLint* params); + void GetSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat* params); + void GenSamplers(GLsizei count, GLuint* samplers); + void DeleteSamplers(GLsizei count, const GLuint* samplers); + void CreateSamplers(GLsizei n, GLuint* samplers); + void BindSamplers(GLuint first, GLsizei count, const GLuint* samplers); + void BindSampler(GLuint unit, GLuint sampler); + } // namespace MG_Impl::GLImpl +} // namespace MobileGL diff --git a/MobileGL/MG_Impl/GLImpl/Sampler/Validators.cpp b/MobileGL/MG_Impl/GLImpl/Sampler/Validators.cpp new file mode 100644 index 00000000..816a1594 --- /dev/null +++ b/MobileGL/MG_Impl/GLImpl/Sampler/Validators.cpp @@ -0,0 +1,128 @@ +#include "Validators.h" +#include +#include +#include + +namespace MobileGL::MG_Impl::GLImpl { + namespace SamplerImpl { + Bool ValidateSamplerName(GLuint sampler) { + if (!MG_State::pGLContext->ValidateSamplerName(sampler)) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidValue, + MakeShared("MG_Impl/GLImpl", "ValidateSamplerName", + std::format("Invalid sampler name {}", sampler))); + return false; + } + return true; + } + + Bool ValidateSamplerObject(GLuint sampler) { + if (!MG_State::pGLContext->ValidateSamplerObject(sampler)) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidOperation, + MakeShared("MG_Impl/GLImpl", "ValidateSamplerObject", + std::format("Sampler object {} does not exist", sampler))); + return false; + } + return true; + } + + Bool ValidateSamplerParam(GLenum pname, GLenum param) { + using namespace MG_Util; + switch (pname) { + case GL_TEXTURE_WRAP_S: + case GL_TEXTURE_WRAP_T: + case GL_TEXTURE_WRAP_R: + if (MG_Util::ConvertGLEnumToSamplerWrapMode(param) == SamplerWrapMode::Unknown) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidEnum, MakeShared("MG_Impl/GLImpl", "ValidateSamplerParam", + "Invalid wrap mode parameter")); + return false; + } + break; + + case GL_TEXTURE_MIN_FILTER: + if (MG_Util::ConvertGLEnumToSamplerFilterMode(param) == SamplerFilterMode::Unknown) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidEnum, MakeShared("MG_Impl/GLImpl", "ValidateSamplerParam", + "Invalid min filter parameter")); + return false; + } + break; + + case GL_TEXTURE_MAG_FILTER: + if (param != GL_NEAREST && param != GL_LINEAR) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidEnum, MakeShared("MG_Impl/GLImpl", "ValidateSamplerParam", + "Invalid mag filter parameter")); + return false; + } + break; + + case GL_TEXTURE_COMPARE_MODE: + if (param != GL_NONE && param != GL_COMPARE_REF_TO_TEXTURE) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidEnum, MakeShared("MG_Impl/GLImpl", "ValidateSamplerParam", + "Invalid compare mode parameter")); + return false; + } + break; + + case GL_TEXTURE_COMPARE_FUNC: + if (param < GL_LEQUAL || param > GL_ALWAYS) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidEnum, MakeShared("MG_Impl/GLImpl", "ValidateSamplerParam", + "Invalid compare function parameter")); + return false; + } + break; + + default: + MG_State::pGLContext->RecordError(ErrorCode::InvalidEnum, + MakeShared("MG_Impl/GLImpl", "ValidateSamplerParam", + "Invalid pname for sampler parameter")); + return false; + } + return true; + } + + Bool ValidateSamplerFloatParam(GLenum pname, GLfloat param) { + switch (pname) { + case GL_TEXTURE_MIN_LOD: + case GL_TEXTURE_MAX_LOD: + case GL_TEXTURE_LOD_BIAS: + return true; + + case GL_TEXTURE_BORDER_COLOR: + if (param < 0.0f || param > 1.0f) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidValue, + MakeShared("MG_Impl/GLImpl", "ValidateSamplerFloatParam", + "Border color component out of [0,1] range")); + return false; + } + return true; + + default: + return ValidateSamplerParam(pname, static_cast(param)); + } + } + + Bool ValidateSamplerIntParam(GLenum pname, GLint param) { + switch (pname) { + case GL_TEXTURE_BORDER_COLOR: + if (param < 0 || param > 255) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidValue, + MakeShared("MG_Impl/GLImpl", "ValidateSamplerIntParam", + "Border color component out of [0,255] range")); + return false; + } + return true; + + default: + return ValidateSamplerParam(pname, static_cast(param)); + } + } + } // namespace SamplerImpl +} // namespace MobileGL::MG_Impl::GLImpl diff --git a/MobileGL/MG_Impl/GLImpl/Sampler/Validators.h b/MobileGL/MG_Impl/GLImpl/Sampler/Validators.h new file mode 100644 index 00000000..e9800d29 --- /dev/null +++ b/MobileGL/MG_Impl/GLImpl/Sampler/Validators.h @@ -0,0 +1,13 @@ +#pragma once +#include +#include + +namespace MobileGL::MG_Impl::GLImpl { + namespace SamplerImpl { + Bool ValidateSamplerName(GLuint sampler); + Bool ValidateSamplerObject(GLuint sampler); + Bool ValidateSamplerParam(GLenum pname, GLenum param); + Bool ValidateSamplerFloatParam(GLenum pname, GLfloat param); + Bool ValidateSamplerIntParam(GLenum pname, GLint param); + } // namespace SamplerImpl +} // namespace MobileGL::MG_Impl::GLImpl