From a347a9780c7560eb3c62901aaa3ba83496d9429c Mon Sep 17 00:00:00 2001 From: BZLZHH Date: Tue, 12 Aug 2025 18:16:16 +0800 Subject: [PATCH] [Feat] (MG_Impl/Texture): Implement GenTextures, DeleteTextures, BindTexture. --- CMakeLists.txt | 18 +- .../MG_Impl/GLImpl/Texture/GL_Texture.cpp | 301 +++++++++++++++--- 2 files changed, 268 insertions(+), 51 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f80cd526..f46823eb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -21,13 +21,19 @@ set(SOURCE_FILES MobileGL/MG_Util/Converters/MGToStr/DataTypeConverter.cpp MobileGL/MG_Util/Converters/MGToStr/GLExtensionConverter.cpp MobileGL/MG_Util/Converters/MGToStr/BufferEnumConverter.cpp + MobileGL/MG_Util/Converters/MGToStr/TextureEnumConverter.cpp MobileGL/MG_Util/Converters/GLToGlslang/GLShaderLangConverter.cpp MobileGL/MG_Util/Converters/MGToGL/ErrorCodeConverter.cpp MobileGL/MG_Util/Converters/MGToGL/BufferEnumConverter.cpp + MobileGL/MG_Util/Converters/MGToGL/TextureEnumConverter.cpp MobileGL/MG_Util/Converters/MGToGL/DataTypeConverter.cpp MobileGL/MG_Util/Converters/GLToMG/BufferEnumConverter.cpp + MobileGL/MG_Util/Converters/GLToMG/TextureEnumConverter.cpp MobileGL/MG_Util/Converters/GLToMG/DataTypeConverter.cpp + MobileGL/MG_Util/ShaderTranspiler/ShaderCompiler.cpp + MobileGL/MG_Util/ShaderTranspiler/SpvcSession.cpp + MobileGL/MG_Impl/GLXImpl/Exporting/Definitions.cpp MobileGL/MG_Impl/GLXImpl/LookUp/LookUp.cpp @@ -37,18 +43,16 @@ set(SOURCE_FILES # @INSERTION_POINT:SOURCE_FILE_GLIMPL@ # MobileGL/MG_Impl/GLImpl/Program/GL_Program.cpp MobileGL/MG_Impl/GLImpl/Texture/GL_Texture.cpp - MobileGL/MG_Impl/GLImpl/VertexArray/Validators.cpp + MobileGL/MG_Impl/GLImpl/Texture/Validators.cpp MobileGL/MG_Impl/GLImpl/VertexArray/GL_VertexArray.cpp - MobileGL/MG_Impl/GLImpl/Exporting/Definitions.cpp - MobileGL/MG_Impl/GLImpl/Getter/GL_Getter.cpp + MobileGL/MG_Impl/GLImpl/VertexArray/Validators.cpp MobileGL/MG_Impl/GLImpl/Buffer/GL_Buffer.cpp MobileGL/MG_Impl/GLImpl/Buffer/Validators.cpp + MobileGL/MG_Impl/GLImpl/Exporting/Definitions.cpp + MobileGL/MG_Impl/GLImpl/Getter/GL_Getter.cpp MobileGL/MG_Backend/Init.cpp - MobileGL/MG_Util/ShaderTranspiler/ShaderCompiler.cpp - MobileGL/MG_Util/ShaderTranspiler/SpvcSession.cpp - MobileGL/MG_State/GLState/Core.cpp MobileGL/MG_State/GLState/ErrorState/Error.cpp MobileGL/MG_State/GLState/BufferState/BufferState.cpp @@ -78,7 +82,7 @@ if(MACOS) ${iOS_LIB_DIR}/libMachineIndependent.a ${iOS_LIB_DIR}/libOSDependent.a ${iOS_LIB_DIR}/libSPIRV-Tools-diff.a - ${iOS_LIB_DIR}/libSPIRV-Tools-link.a + ${iOS_LIB_DIR}/libSPIRV-Tools-link.aBuffer ${iOS_LIB_DIR}/libSPIRV-Tools-lint.a ${iOS_LIB_DIR}/libSPIRV-Tools-opt.a ${iOS_LIB_DIR}/libSPIRV-Tools-reduce.a diff --git a/MobileGL/MG_Impl/GLImpl/Texture/GL_Texture.cpp b/MobileGL/MG_Impl/GLImpl/Texture/GL_Texture.cpp index 530309c0..4a675fe6 100644 --- a/MobileGL/MG_Impl/GLImpl/Texture/GL_Texture.cpp +++ b/MobileGL/MG_Impl/GLImpl/Texture/GL_Texture.cpp @@ -1,166 +1,379 @@ #include "GL_Texture.h" +#include "Validators.h" +#include +#include +#include +#include +#include namespace MobileGL { namespace MG_Impl::GLImpl { - /* @INSERTION_POINT:FUNCTION_IMPLEMENTATION@ */ - void TexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, - GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* pixels) { + 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) { // TODO: implement } - void TexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, - GLenum format, GLenum type, const void* pixels) { + void TexSubImage2D_State(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, + GLsizei height, GLenum format, GLenum type, const void* pixels) { // TODO: implement } - void TexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, - const GLvoid* pixels) { + void TexSubImage1D_State(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, + const GLvoid* pixels) { // TODO: implement } - void TexParameterf(GLenum target, GLenum pname, GLfloat param) { + void TexParameterf_State(GLenum target, GLenum pname, GLfloat param) { // TODO: implement } - void TexParameteri(GLenum target, GLenum pname, GLint param) { + void TexParameteri_State(GLenum target, GLenum pname, GLint param) { // TODO: implement } - void TexImage3DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, - GLsizei depth, GLboolean fixedsamplelocations) { + void TexImage3DMultisample_State(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, + GLsizei height, GLsizei depth, GLboolean fixedsamplelocations) { // TODO: implement } - void TexImage2DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, - GLboolean fixedsamplelocations) { + void TexImage2DMultisample_State(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, + GLsizei height, GLboolean fixedsamplelocations) { // TODO: implement } - void TexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, - GLint border, GLenum format, GLenum type, const void* pixels) { + void TexImage3D_State(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, + GLsizei depth, GLint border, GLenum format, GLenum type, const void* pixels) { // TODO: implement } - void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, - GLenum format, GLenum type, const void* pixels) { + void TexImage2D_State(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, + GLint border, GLenum format, GLenum type, const void* pixels) { // TODO: implement } - void TexImage1D(GLenum target, GLint level, GLint internalFormat, GLsizei width, GLint border, GLenum format, - GLenum type, const GLvoid* pixels) { + void TexImage1D_State(GLenum target, GLint level, GLint internalFormat, GLsizei width, GLint border, + GLenum format, GLenum type, const GLvoid* pixels) { // TODO: implement } - void TexBuffer(GLenum target, GLenum internalformat, GLuint buffer) { + void TexBuffer_State(GLenum target, GLenum internalformat, GLuint texture) { // TODO: implement } - GLboolean IsTexture(GLuint texture) { + GLboolean IsTexture_State(GLuint texture) { // TODO: implement return GL_FALSE; } - void GetTexParameterIuiv(GLenum target, GLenum pname, GLuint* params) { + void GetTexParameterIuiv_State(GLenum target, GLenum pname, GLuint* params) { // TODO: implement } + void GetTexParameterIiv_State(GLenum target, GLenum pname, GLint* params) { + // TODO: implement + } + + void GetTexParameteriv_State(GLenum target, GLenum pname, GLint* params) { + // TODO: implement + } + + void GetTexParameterfv_State(GLenum target, GLenum pname, GLfloat* params) { + // TODO: implement + } + + void GetTexLevelParameteriv_State(GLenum target, GLint level, GLenum pname, GLint* params) { + // TODO: implement + } + + void GetTexLevelParameterfv_State(GLenum target, GLint level, GLenum pname, GLfloat* params) { + // TODO: implement + } + + void GetTexImage_State(GLenum target, GLint level, GLenum format, GLenum type, GLvoid* pixels) { + // TODO: implement + } + + void GetCompressedTexImage_State(GLenum target, GLint level, void* img) { + // TODO: implement + } + + void GenTextures_State(GLsizei n, GLuint* textures) { + if (n < 0) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidValue, + MakeShared("MG_Impl/GLImpl", "GenTextures_State", "n must be non-negative")); + return; + } + auto textureNames = MG_State::pGLContext->GenTextureNames(n); + Copy(textureNames.data(), textures, textureNames.size()); + } + + void DeleteTextures_State(GLsizei n, const GLuint* textures) { + if (n < 0) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidValue, + MakeShared("MG_Impl/GLImpl", "DeleteTextures_State", "n must be non-negative.")); + return; + } + + if (!textures) { + MG_State::pGLContext->RecordError(ErrorCode::InvalidValue, + MakeShared("MG_Impl/GLImpl", "DeleteTextures_State", + "Texture names array cannot be null.")); + return; + } + + for (SizeT i = 0; i < static_cast(n); ++i) { + Uint textureName = textures[i]; + if (textureName == 0) continue; + if (!TextureImpl::ValidateTextureName(textureName, true)) continue; + MG_State::pGLContext->MarkTextureObjectForDeletion(textureName); + } + } + + void CopyTexSubImage3D_State(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, + GLint y, GLsizei width, GLsizei height) { + // TODO: implement + } + + void CopyTexSubImage2D_State(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, + GLsizei width, GLsizei height) { + // TODO: implement + } + + void CopyTexSubImage1D_State(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width) { + // TODO: implement + } + + void CopyTexImage2D_State(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, + GLsizei height, GLint border) { + // TODO: implement + } + + void CopyTexImage1D_State(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, + GLint border) { + // TODO: implement + } + + void CompressedTexSubImage3D_State(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, + GLsizei width, GLsizei height, GLsizei depth, GLenum format, + GLsizei imageSize, const void* data) { + // TODO: implement + } + + void CompressedTexSubImage2D_State(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, + GLsizei height, GLenum format, GLsizei imageSize, const void* data) { + // TODO: implement + } + + void CompressedTexSubImage1D_State(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, + GLsizei imageSize, const void* data) { + // TODO: implement + } + + void CompressedTexImage3D_State(GLenum target, GLint level, GLenum internalformat, GLsizei width, + GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, + const void* data) { + // TODO: implement + } + + void CompressedTexImage2D_State(GLenum target, GLint level, GLenum internalformat, GLsizei width, + GLsizei height, GLint border, GLsizei imageSize, const void* data) { + // TODO: implement + } + + void CompressedTexImage1D_State(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, + GLsizei imageSize, const void* data) { + // TODO: implement + } + + void BindTexture_State(GLenum target, GLuint texture) { + if (!TextureImpl::ValidateTextureName(texture, true)) return; + + TextureTarget textureTarget = MG_Util::ConvertGLEnumToTextureTarget(target); + if (!TextureImpl::ValidateTextureTarget(textureTarget)) return; + + auto textureObject = MG_State::pGLContext->GetTextureObject(texture); + + if (!textureObject) { + textureObject = MG_State::pGLContext->CreateTextureObject(texture, textureTarget); + } else if (textureObject->GetTarget() != textureTarget) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidOperation, + MakeShared("MG_Impl/GLImpl", "BindTexture_State", + "Texture target does not match the previously created texture")); + return; + } + + auto& currentUnit = + MG_State::pGLContext->GetTextureUnitObject(MG_State::pGLContext->GetActiveTextureUnit()); + auto& bindingSlot = currentUnit.GetBindingSlot(textureTarget); + bindingSlot.Bind(textureObject); + } + + void ActiveTexture_State(GLenum texture) { + // TODO: implement + } + + /* @INSERTION_POINT:FUNCTION_IMPLEMENTATION@ */ + void TexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, + GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* pixels) { + TexSubImage3D_State(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); + } + + void TexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, + GLenum format, GLenum type, const void* pixels) { + TexSubImage2D_State(target, level, xoffset, yoffset, width, height, format, type, pixels); + } + + void TexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, + const GLvoid* pixels) { + TexSubImage1D_State(target, level, xoffset, width, format, type, pixels); + } + + void TexParameterf(GLenum target, GLenum pname, GLfloat param) { + TexParameterf_State(target, pname, param); + } + + void TexParameteri(GLenum target, GLenum pname, GLint param) { + TexParameteri_State(target, pname, param); + } + + void TexImage3DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, + GLsizei depth, GLboolean fixedsamplelocations) { + TexImage3DMultisample_State(target, samples, internalformat, width, height, depth, fixedsamplelocations); + } + + void TexImage2DMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, + GLboolean fixedsamplelocations) { + TexImage2DMultisample_State(target, samples, internalformat, width, height, fixedsamplelocations); + } + + void TexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, + GLint border, GLenum format, GLenum type, const void* pixels) { + TexImage3D_State(target, level, internalformat, width, height, depth, border, format, type, pixels); + } + + void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, + GLenum format, GLenum type, const void* pixels) { + TexImage2D_State(target, level, internalformat, width, height, border, format, type, pixels); + } + + void TexImage1D(GLenum target, GLint level, GLint internalFormat, GLsizei width, GLint border, GLenum format, + GLenum type, const GLvoid* pixels) { + TexImage1D_State(target, level, internalFormat, width, border, format, type, pixels); + } + + void TexBuffer(GLenum target, GLenum internalformat, GLuint texture) { + TexBuffer_State(target, internalformat, texture); + } + + GLboolean IsTexture(GLuint texture) { + return IsTexture_State(texture); + } + + void GetTexParameterIuiv(GLenum target, GLenum pname, GLuint* params) { + GetTexParameterIuiv_State(target, pname, params); + } + void GetTexParameterIiv(GLenum target, GLenum pname, GLint* params) { - // TODO: implement + GetTexParameterIiv_State(target, pname, params); } void GetTexParameteriv(GLenum target, GLenum pname, GLint* params) { - // TODO: implement + GetTexParameteriv_State(target, pname, params); } void GetTexParameterfv(GLenum target, GLenum pname, GLfloat* params) { - // TODO: implement + GetTexParameterfv_State(target, pname, params); } void GetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint* params) { - // TODO: implement + GetTexLevelParameteriv_State(target, level, pname, params); } void GetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat* params) { - // TODO: implement + GetTexLevelParameterfv_State(target, level, pname, params); } void GetTexImage(GLenum target, GLint level, GLenum format, GLenum type, GLvoid* pixels) { - // TODO: implement + GetTexImage_State(target, level, format, type, pixels); } void GetCompressedTexImage(GLenum target, GLint level, void* img) { - // TODO: implement + GetCompressedTexImage_State(target, level, img); } void GenTextures(GLsizei n, GLuint* textures) { - // TODO: implement + GenTextures_State(n, textures); } void DeleteTextures(GLsizei n, const GLuint* textures) { - // TODO: implement + DeleteTextures_State(n, textures); } void CopyTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height) { - // TODO: implement + CopyTexSubImage3D_State(target, level, xoffset, yoffset, zoffset, x, y, width, height); } void CopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height) { - // TODO: implement + CopyTexSubImage2D_State(target, level, xoffset, yoffset, x, y, width, height); } void CopyTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width) { - // TODO: implement + CopyTexSubImage1D_State(target, level, xoffset, x, y, width); } void CopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border) { - // TODO: implement + CopyTexImage2D_State(target, level, internalformat, x, y, width, height, border); } void CopyTexImage1D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border) { - // TODO: implement + CopyTexImage1D_State(target, level, internalformat, x, y, width, border); } void CompressedTexSubImage3D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void* data) { - // TODO: implement + CompressedTexSubImage3D_State(target, level, xoffset, yoffset, zoffset, width, height, depth, format, + imageSize, data); } void CompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data) { - // TODO: implement + CompressedTexSubImage2D_State(target, level, xoffset, yoffset, width, height, format, imageSize, data); } void CompressedTexSubImage1D(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void* data) { - // TODO: implement + CompressedTexSubImage1D_State(target, level, xoffset, width, format, imageSize, data); } void CompressedTexImage3D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void* data) { - // TODO: implement + CompressedTexImage3D_State(target, level, internalformat, width, height, depth, border, imageSize, data); } void CompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void* data) { - // TODO: implement + CompressedTexImage2D_State(target, level, internalformat, width, height, border, imageSize, data); } void CompressedTexImage1D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void* data) { - // TODO: implement + CompressedTexImage1D_State(target, level, internalformat, width, border, imageSize, data); } void BindTexture(GLenum target, GLuint texture) { - // TODO: implement + BindTexture_State(target, texture); } void ActiveTexture(GLenum texture) { - // TODO: implement + ActiveTexture_State(texture); } } // namespace MG_Impl::GLImpl