mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-09-12 06:08:30 +09:00
115 lines
5.9 KiB
C++
115 lines
5.9 KiB
C++
// MobileGL - MobileGL/MG_Backend/DirectGLES/Utils.h
|
|
// Copyright (c) 2025-2026 MobileGL-Dev
|
|
// Licensed under the GNU Lesser General Public License v3.0:
|
|
// https://www.gnu.org/licenses/gpl-3.0.txt
|
|
// https://www.gnu.org/licenses/lgpl-3.0.txt
|
|
// SPDX-License-Identifier: LGPL-3.0-only
|
|
// End of Source File Header
|
|
|
|
#pragma once
|
|
#include <Includes.h>
|
|
#include <MG_State/GLState/Core.h>
|
|
|
|
namespace MobileGL::MG_Backend::DirectGLES {
|
|
namespace DebugImpl {
|
|
class ErrorLopper {
|
|
public:
|
|
static void Loop(const std::function<void(GLenum)>&);
|
|
static void Clear();
|
|
ErrorLopper();
|
|
~ErrorLopper();
|
|
};
|
|
|
|
class OpenGLScopeMarker {
|
|
public:
|
|
explicit OpenGLScopeMarker(const String& scopeName);
|
|
~OpenGLScopeMarker();
|
|
};
|
|
} // namespace DebugImpl
|
|
|
|
namespace BufferImpl {} // namespace BufferImpl
|
|
|
|
namespace VertexArrayImpl {
|
|
GLenum GetBindingQuery(GLenum target, bool isTexture);
|
|
} // namespace VertexArrayImpl
|
|
|
|
namespace TextureImpl {
|
|
void GenerateTextureFormatInfo(TextureInternalFormat internalFormat, GLenum* outInternalFormat,
|
|
GLenum* outFormat, GLenum* outType,
|
|
TextureTarget target = TextureTarget::Unknown);
|
|
void GenerateRenderbufferFormatInfo(TextureInternalFormat internalFormat, GLenum* outInternalFormat,
|
|
GLenum* outFormat, GLenum* outType);
|
|
Bool ShouldUseCaveatTextureFormat(TextureInternalFormat internalFormat, TextureTarget target);
|
|
Bool ShouldUseCaveatRenderbufferFormat(TextureInternalFormat internalFormat);
|
|
} // namespace TextureImpl
|
|
|
|
namespace FramebufferImpl {} // namespace FramebufferImpl
|
|
|
|
// Pure CPU helpers of the client-format readback conversion (ReadPixels/GetTexImage repack a wide
|
|
// RGBA(_INTEGER) read into the caller's (format, type) layout). Kept context-free so unit tests can
|
|
// exercise the exact packing the GL CTS packed_pixels oracle compares against.
|
|
namespace ReadbackImpl {
|
|
struct ReadbackChannelMapping {
|
|
Int sourceChannel[4]; // RGBA source channel feeding each destination component
|
|
Int channelCount; // destination component count
|
|
Bool isInteger;
|
|
};
|
|
Bool GetReadbackChannelMapping(GLenum format, ReadbackChannelMapping& outMapping);
|
|
|
|
// Byte size of one destination component of `type`; packed types report the packed word size.
|
|
// 0 = type not supported by the conversion path.
|
|
SizeT GetReadbackComponentSize(GLenum type);
|
|
|
|
// Bit-field layout of a GL packed pixel type. width/shift are indexed in the client format's
|
|
// component order (matching ReadbackChannelMapping); shift is the LSB position of the field in
|
|
// the packed word: non-REV types pack the first component from the MSB, *_REV types from the
|
|
// LSB (GL 3.3 table 3.6; field positions mirror the GL CTS glcPackedPixelsTests pack_* oracle).
|
|
struct PackedReadbackLayout {
|
|
Int fieldCount; // format components stored in the packed word
|
|
Int width[4]; // bit width of each component's field
|
|
Int shift[4]; // LSB bit position of each component's field
|
|
SizeT byteSize; // packed word size in bytes (1, 2 or 4)
|
|
Bool isFloatPacked; // 10F_11F_11F_REV / 5_9_9_9_REV: fields hold unsigned small floats
|
|
};
|
|
Bool GetPackedReadbackLayout(GLenum type, PackedReadbackLayout& out);
|
|
|
|
// Unsigned small-float encoders (EXT_packed_float / EXT_texture_shared_exponent semantics).
|
|
Uint32 EncodeFloatToUnsignedF11(Float value);
|
|
Uint32 EncodeFloatToUnsignedF10(Float value);
|
|
Uint32 EncodeSharedExponentRGB9E5(const Float rgb[3]);
|
|
|
|
// Destination bytes per pixel for a (format mapping, type) readback pair; 0 when the pair is
|
|
// not convertible (unknown type, packed field count != format component count, floating-point
|
|
// or packed-float type with an integer format).
|
|
SizeT GetReadbackDstPixelSize(const ReadbackChannelMapping& mapping, GLenum type);
|
|
|
|
// Repacks one row of wide RGBA(_INTEGER) texels (4 components of wideType each) into the
|
|
// client's (format, type) layout. src holds width * 4 * GetReadbackComponentSize(wideType)
|
|
// bytes, dst receives width * GetReadbackDstPixelSize(mapping, type) bytes.
|
|
void ConvertWideReadbackRow(const Uint8* src, Uint8* dst, SizeT width, GLenum wideType,
|
|
const ReadbackChannelMapping& mapping, GLenum type);
|
|
|
|
// Stores wide RGBA(_INTEGER) rows into the client pointer or the bound PACK pixel buffer,
|
|
// honoring the client-side PACK pixel-store parameters (row length, alignment, skips,
|
|
// swap-bytes, and - when applyPackImageParams - image height/skip images). Shared by the
|
|
// DirectGLES and DirectVulkan readback conversion paths.
|
|
Bool StoreWideRowsToClient(const Uint8* wide, GLenum wideType, GLsizei width, GLsizei sliceHeight,
|
|
GLsizei sliceCount, const ReadbackChannelMapping& mapping, GLenum type,
|
|
void* pixels, Bool applyPackImageParams);
|
|
} // namespace ReadbackImpl
|
|
|
|
namespace PrgramImpl {
|
|
String ProcessOutColorLocations(const String& glslCode);
|
|
String ForceSupporterOutput(const String& glslCode);
|
|
String ClampNormFallbackOutputs(String glslCode, GLenum shaderType, Uint32 snormOutputMask,
|
|
Uint32 unormOutputMask);
|
|
String ForceFlatIntegerVaryings(const String& glslCode, GLenum shaderType);
|
|
String RemoveLayoutBinding(const String& glslCode);
|
|
} // namespace PrgramImpl
|
|
|
|
namespace Utils {
|
|
void CheckGLESError();
|
|
GLenum GetBindingQuery(GLenum target, bool isTexture);
|
|
} // namespace Utils
|
|
} // namespace MobileGL::MG_Backend::DirectGLES
|