summaryrefslogtreecommitdiff
path: root/Runtime/GfxDevice/opengles30/UtilsGLES30.cpp
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2019-08-14 22:50:43 +0800
committerchai <chaifix@163.com>2019-08-14 22:50:43 +0800
commit15740faf9fe9fe4be08965098bbf2947e096aeeb (patch)
treea730ec236656cc8cab5b13f088adfaed6bb218fb /Runtime/GfxDevice/opengles30/UtilsGLES30.cpp
+Unity Runtime codeHEADmaster
Diffstat (limited to 'Runtime/GfxDevice/opengles30/UtilsGLES30.cpp')
-rw-r--r--Runtime/GfxDevice/opengles30/UtilsGLES30.cpp181
1 files changed, 181 insertions, 0 deletions
diff --git a/Runtime/GfxDevice/opengles30/UtilsGLES30.cpp b/Runtime/GfxDevice/opengles30/UtilsGLES30.cpp
new file mode 100644
index 0000000..2c28c12
--- /dev/null
+++ b/Runtime/GfxDevice/opengles30/UtilsGLES30.cpp
@@ -0,0 +1,181 @@
+#include "UnityPrefix.h"
+#include "UtilsGLES30.h"
+
+#include "IncludesGLES30.h"
+
+UInt32 GetColorFormatGLES30 (RenderTextureFormat format)
+{
+ switch (format)
+ {
+ case kRTFormatARGB32: return GL_RGBA8;
+ case kRTFormatDepth: return GL_NONE;
+ case kRTFormatARGBHalf: return GL_RGBA16F;
+ case kRTFormatShadowMap: return GL_NONE;
+ case kRTFormatRGB565: return GL_RGB565;
+ case kRTFormatARGB4444: return GL_RGBA4;
+ case kRTFormatARGB1555: return GL_RGB5_A1;
+ case kRTFormatDefault: return GL_RGBA8;
+ case kRTFormatA2R10G10B10: return GL_RGB10_A2;
+ case kRTFormatDefaultHDR: return GL_R11F_G11F_B10F;
+ case kRTFormatARGB64: return GL_RGBA8;
+ case kRTFormatARGBFloat: return GL_RGBA32F;
+ case kRTFormatRGFloat: return GL_RG32F;
+ case kRTFormatRGHalf: return GL_RG16F;
+ case kRTFormatRFloat: return GL_R32F;
+ case kRTFormatRHalf: return GL_R16F;
+ case kRTFormatR8: return GL_R8;
+ case kRTFormatARGBInt: return GL_RGBA32I;
+ case kRTFormatRGInt: return GL_RG32I;
+ case kRTFormatRInt: return GL_R32I;
+ default:
+ Assert("Invalid RenderTextureFormat");
+ return GL_RGBA8;
+ }
+}
+
+UInt32 GetDepthOnlyFormatGLES30 (DepthBufferFormat format)
+{
+ switch (format)
+ {
+ case kDepthFormatNone: return GL_NONE;
+ case kDepthFormat16: return GL_DEPTH_COMPONENT16;
+ case kDepthFormat24: return GL_DEPTH_COMPONENT24;
+ default:
+ Assert("Invalid DepthBufferFormat");
+ return GL_NONE;
+ }
+}
+
+UInt32 GetDepthStencilFormatGLES30 (DepthBufferFormat format)
+{
+ switch (format)
+ {
+ case kDepthFormatNone: return GL_STENCIL_INDEX8;
+ case kDepthFormat16: return GL_DEPTH24_STENCIL8;
+ case kDepthFormat24: return GL_DEPTH24_STENCIL8;
+ default:
+ Assert("Invalid DepthBufferFormat");
+ return GL_NONE;
+ }
+}
+
+TransferFormatGLES30 GetTransferFormatGLES30 (UInt32 internalFormat)
+{
+ switch (internalFormat)
+ {
+ case GL_RGBA32F: return TransferFormatGLES30(GL_RGBA, GL_FLOAT );
+ case GL_RGBA32I: return TransferFormatGLES30(GL_RGBA_INTEGER, GL_INT );
+ case GL_RGBA32UI: return TransferFormatGLES30(GL_RGBA_INTEGER, GL_UNSIGNED_INT );
+ case GL_RGBA16F: return TransferFormatGLES30(GL_RGBA, GL_HALF_FLOAT );
+ case GL_RGBA16I: return TransferFormatGLES30(GL_RGBA_INTEGER, GL_SHORT );
+ case GL_RGBA16UI: return TransferFormatGLES30(GL_RGBA_INTEGER, GL_UNSIGNED_SHORT );
+ case GL_RGBA8: return TransferFormatGLES30(GL_RGBA, GL_UNSIGNED_BYTE );
+ case GL_RGBA8I: return TransferFormatGLES30(GL_RGBA_INTEGER, GL_BYTE );
+ case GL_RGBA8UI: return TransferFormatGLES30(GL_RGBA_INTEGER, GL_UNSIGNED_BYTE );
+ case GL_SRGB8_ALPHA8: return TransferFormatGLES30(GL_RGBA, GL_UNSIGNED_BYTE );
+ case GL_RGB10_A2: return TransferFormatGLES30(GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV );
+ case GL_RGB10_A2UI: return TransferFormatGLES30(GL_RGBA_INTEGER, GL_UNSIGNED_INT_2_10_10_10_REV );
+ case GL_RGBA4: return TransferFormatGLES30(GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4 );
+ case GL_RGB5_A1: return TransferFormatGLES30(GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1 );
+ case GL_RGBA8_SNORM: return TransferFormatGLES30(GL_RGBA, GL_BYTE );
+ case GL_RGB8: return TransferFormatGLES30(GL_RGB, GL_UNSIGNED_BYTE );
+ case GL_RGB565: return TransferFormatGLES30(GL_RGB, GL_UNSIGNED_SHORT_5_6_5 );
+ case GL_R11F_G11F_B10F: return TransferFormatGLES30(GL_RGB, GL_UNSIGNED_INT_10F_11F_11F_REV );
+ case GL_RGB32F: return TransferFormatGLES30(GL_RGB, GL_FLOAT );
+ case GL_RGB32I: return TransferFormatGLES30(GL_RGB_INTEGER, GL_INT );
+ case GL_RGB32UI: return TransferFormatGLES30(GL_RGB_INTEGER, GL_UNSIGNED_INT );
+ case GL_RGB16F: return TransferFormatGLES30(GL_RGB, GL_HALF_FLOAT );
+ case GL_RGB16I: return TransferFormatGLES30(GL_RGB_INTEGER, GL_SHORT );
+ case GL_RGB16UI: return TransferFormatGLES30(GL_RGB_INTEGER, GL_UNSIGNED_SHORT );
+ case GL_RGB8_SNORM: return TransferFormatGLES30(GL_RGB, GL_BYTE );
+ case GL_RGB8I: return TransferFormatGLES30(GL_RGB_INTEGER, GL_BYTE );
+ case GL_RGB8UI: return TransferFormatGLES30(GL_RGB_INTEGER, GL_UNSIGNED_BYTE );
+ case GL_SRGB8: return TransferFormatGLES30(GL_RGB, GL_UNSIGNED_BYTE );
+ case GL_RGB9_E5: return TransferFormatGLES30(GL_RGB, GL_UNSIGNED_INT_5_9_9_9_REV );
+ case GL_RG32F: return TransferFormatGLES30(GL_RG, GL_FLOAT );
+ case GL_RG32I: return TransferFormatGLES30(GL_RG_INTEGER, GL_INT );
+ case GL_RG32UI: return TransferFormatGLES30(GL_RG_INTEGER, GL_UNSIGNED_INT );
+ case GL_RG16F: return TransferFormatGLES30(GL_RG, GL_HALF_FLOAT );
+ case GL_RG16I: return TransferFormatGLES30(GL_RG_INTEGER, GL_SHORT );
+ case GL_RG16UI: return TransferFormatGLES30(GL_RG_INTEGER, GL_UNSIGNED_SHORT );
+ case GL_RG8: return TransferFormatGLES30(GL_RG, GL_UNSIGNED_BYTE );
+ case GL_RG8I: return TransferFormatGLES30(GL_RG_INTEGER, GL_BYTE );
+ case GL_RG8UI: return TransferFormatGLES30(GL_RG_INTEGER, GL_UNSIGNED_BYTE );
+ case GL_RG8_SNORM: return TransferFormatGLES30(GL_RG, GL_BYTE );
+ case GL_R32F: return TransferFormatGLES30(GL_RED, GL_FLOAT );
+ case GL_R32I: return TransferFormatGLES30(GL_RED_INTEGER, GL_INT );
+ case GL_R32UI: return TransferFormatGLES30(GL_RED_INTEGER, GL_UNSIGNED_INT );
+ case GL_R16F: return TransferFormatGLES30(GL_RED, GL_HALF_FLOAT );
+ case GL_R16I: return TransferFormatGLES30(GL_RED_INTEGER, GL_SHORT );
+ case GL_R16UI: return TransferFormatGLES30(GL_RED_INTEGER, GL_UNSIGNED_SHORT );
+ case GL_R8: return TransferFormatGLES30(GL_RED, GL_UNSIGNED_BYTE );
+ case GL_R8I: return TransferFormatGLES30(GL_RED_INTEGER, GL_BYTE );
+ case GL_R8UI: return TransferFormatGLES30(GL_RED_INTEGER, GL_UNSIGNED_BYTE );
+ case GL_R8_SNORM: return TransferFormatGLES30(GL_RED, GL_BYTE );
+ case GL_DEPTH_COMPONENT32F: return TransferFormatGLES30(GL_DEPTH_COMPONENT, GL_FLOAT );
+ case GL_DEPTH_COMPONENT24: return TransferFormatGLES30(GL_DEPTH_COMPONENT, GL_UNSIGNED_INT );
+ case GL_DEPTH_COMPONENT16: return TransferFormatGLES30(GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT );
+ case GL_DEPTH32F_STENCIL8: return TransferFormatGLES30(GL_DEPTH_STENCIL, GL_FLOAT_32_UNSIGNED_INT_24_8_REV );
+ case GL_DEPTH24_STENCIL8: return TransferFormatGLES30(GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8 );
+ default: return TransferFormatGLES30(GL_NONE, GL_NONE );
+ }
+}
+
+UInt32 GetDefaultFramebufferColorFormatGLES30 (void)
+{
+ int redBits = 0;
+ int greenBits = 0;
+ int blueBits = 0;
+ int alphaBits = 0;
+
+ glGetIntegerv(GL_RED_BITS, &redBits);
+ glGetIntegerv(GL_GREEN_BITS, &greenBits);
+ glGetIntegerv(GL_BLUE_BITS, &blueBits);
+ glGetIntegerv(GL_ALPHA_BITS, &alphaBits);
+
+#define PACK_FMT(R, G, B, A) (((R) << 24) | ((G) << 16) | ((B) << 8) | (A))
+
+ // \note [pyry] This may not hold true on some implementations - best effort guess only.
+ switch (PACK_FMT(redBits, greenBits, blueBits, alphaBits))
+ {
+ case PACK_FMT(8,8,8,8): return GL_RGBA8;
+ case PACK_FMT(8,8,8,0): return GL_RGB8;
+ case PACK_FMT(4,4,4,4): return GL_RGBA4;
+ case PACK_FMT(5,5,5,1): return GL_RGB5_A1;
+ case PACK_FMT(5,6,5,0): return GL_RGB565;
+ default: return GL_NONE;
+ }
+
+#undef PACK_FMT
+}
+
+UInt32 GetDefaultFramebufferDepthFormatGLES30 (void)
+{
+ int depthBits = 0;
+ int stencilBits = 0;
+ glGetIntegerv(GL_DEPTH_BITS, &depthBits);
+ glGetIntegerv(GL_STENCIL_BITS, &stencilBits);
+
+ if(stencilBits > 0)
+ {
+ switch (depthBits)
+ {
+ case 32: return GL_DEPTH32F_STENCIL8;
+ case 24: return GL_DEPTH24_STENCIL8;
+ case 16: return GL_DEPTH_COMPONENT16; // There's probably no such config?
+ default: return GL_NONE;
+ }
+
+ }
+ else
+ {
+ switch (depthBits)
+ {
+ case 32: return GL_DEPTH_COMPONENT32F;
+ case 24: return GL_DEPTH_COMPONENT24;
+ case 16: return GL_DEPTH_COMPONENT16;
+ default: return GL_NONE;
+ }
+
+ }
+}