Skip to content

Commit 1c2822a

Browse files
authored
Restore GLES support for BGR/ARGB/BGRA/ABGR texture formats via swizzle (#2837)
* Initial plan * fix: restore GLES swizzled byte-order texture formats * test: clarify GLES swizzle format expectations --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
1 parent b49f77c commit 1c2822a

3 files changed

Lines changed: 59 additions & 10 deletions

File tree

jme3-core/src/main/java/com/jme3/renderer/opengl/GLImageFormats.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,12 +169,17 @@ public static GLImageFormat[][] getFormatsForCaps(EnumSet<Caps> caps) {
169169
format(formatToGL, Format.RGB565, GL2.GL_RGB8, GL.GL_RGB, GL.GL_UNSIGNED_SHORT_5_6_5, opengl || opengles3 || webgl, false, true);
170170
}
171171

172-
// Additional desktop-specific formats.
172+
// Additional byte-order formats supported directly on desktop GL.
173173
if (opengl) {
174174
format(formatToGL, Format.BGR8, GL2.GL_RGB8, GL2.GL_BGR, GL.GL_UNSIGNED_BYTE, true, false, true);
175175
format(formatToGL, Format.ARGB8, GLExt.GL_RGBA8, GL2.GL_BGRA, GL2.GL_UNSIGNED_INT_8_8_8_8, true, false, true);
176176
format(formatToGL, Format.BGRA8, GLExt.GL_RGBA8, GL2.GL_BGRA, GL.GL_UNSIGNED_BYTE, true, false, true);
177177
format(formatToGL, Format.ABGR8, GLExt.GL_RGBA8, GL.GL_RGBA, GL2.GL_UNSIGNED_INT_8_8_8_8, true, false, true);
178+
} else if (opengles3) {
179+
formatSwiz(formatToGL, Format.BGR8, GL2.GL_RGB8, GL.GL_RGB, GL.GL_UNSIGNED_BYTE, true, false, true);
180+
formatSwiz(formatToGL, Format.ARGB8, GLExt.GL_RGBA8, GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, true, false, true);
181+
formatSwiz(formatToGL, Format.BGRA8, GLExt.GL_RGBA8, GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, true, false, true);
182+
formatSwiz(formatToGL, Format.ABGR8, GLExt.GL_RGBA8, GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, true, false, true);
178183
}
179184

180185
// sRGB formats
@@ -193,6 +198,12 @@ public static GLImageFormat[][] getFormatsForCaps(EnumSet<Caps> caps) {
193198
formatSrgb(formatToGL, Format.ABGR8, GLExt.GL_SRGB8_ALPHA8_EXT, GL.GL_RGBA, GL2.GL_UNSIGNED_INT_8_8_8_8, true, false, true);
194199
formatSrgb(formatToGL, Format.ARGB8, GLExt.GL_SRGB8_ALPHA8_EXT, GL2.GL_BGRA, GL2.GL_UNSIGNED_INT_8_8_8_8, true, false, true);
195200
formatSrgb(formatToGL, Format.BGRA8, GLExt.GL_SRGB8_ALPHA8_EXT, GL2.GL_BGRA, GL.GL_UNSIGNED_BYTE, true, false, true);
201+
} else if (opengles3) {
202+
// Match GLES RGB8/sRGB8 renderability for the same internal format.
203+
formatSrgbSwiz(formatToGL, Format.BGR8, GLExt.GL_SRGB8_EXT, GL.GL_RGB, GL.GL_UNSIGNED_BYTE, false, false, true);
204+
formatSrgbSwiz(formatToGL, Format.ARGB8, GLExt.GL_SRGB8_ALPHA8_EXT, GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, true, false, true);
205+
formatSrgbSwiz(formatToGL, Format.BGRA8, GLExt.GL_SRGB8_ALPHA8_EXT, GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, true, false, true);
206+
formatSrgbSwiz(formatToGL, Format.ABGR8, GLExt.GL_SRGB8_ALPHA8_EXT, GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, true, false, true);
196207
}
197208

198209
if (caps.contains(Caps.TextureCompressionS3TC)) {

jme3-core/src/main/java/com/jme3/renderer/opengl/TextureUtil.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,24 @@ private void setupTextureSwizzle(int target, Format format) {
128128
gl.glTexParameteri(target, GL3.GL_TEXTURE_SWIZZLE_B, GL.GL_RED);
129129
gl.glTexParameteri(target, GL3.GL_TEXTURE_SWIZZLE_A, GL.GL_GREEN);
130130
break;
131+
case BGR8:
132+
gl.glTexParameteri(target, GL3.GL_TEXTURE_SWIZZLE_R, GL.GL_BLUE);
133+
gl.glTexParameteri(target, GL3.GL_TEXTURE_SWIZZLE_G, GL.GL_GREEN);
134+
gl.glTexParameteri(target, GL3.GL_TEXTURE_SWIZZLE_B, GL.GL_RED);
135+
gl.glTexParameteri(target, GL3.GL_TEXTURE_SWIZZLE_A, GL.GL_ONE);
136+
break;
137+
case ARGB8:
138+
gl.glTexParameteri(target, GL3.GL_TEXTURE_SWIZZLE_R, GL.GL_GREEN);
139+
gl.glTexParameteri(target, GL3.GL_TEXTURE_SWIZZLE_G, GL.GL_BLUE);
140+
gl.glTexParameteri(target, GL3.GL_TEXTURE_SWIZZLE_B, GL.GL_ALPHA);
141+
gl.glTexParameteri(target, GL3.GL_TEXTURE_SWIZZLE_A, GL.GL_RED);
142+
break;
143+
case BGRA8:
144+
gl.glTexParameteri(target, GL3.GL_TEXTURE_SWIZZLE_R, GL.GL_BLUE);
145+
gl.glTexParameteri(target, GL3.GL_TEXTURE_SWIZZLE_G, GL.GL_GREEN);
146+
gl.glTexParameteri(target, GL3.GL_TEXTURE_SWIZZLE_B, GL.GL_RED);
147+
gl.glTexParameteri(target, GL3.GL_TEXTURE_SWIZZLE_A, GL.GL_ALPHA);
148+
break;
131149
case ABGR8:
132150
gl.glTexParameteri(target, GL3.GL_TEXTURE_SWIZZLE_R, GL.GL_ALPHA);
133151
gl.glTexParameteri(target, GL3.GL_TEXTURE_SWIZZLE_G, GL.GL_BLUE);

jme3-core/src/test/java/com/jme3/renderer/opengl/GLImageFormatsTest.java

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
import static org.junit.jupiter.api.Assertions.assertEquals;
4040
import static org.junit.jupiter.api.Assertions.assertNotNull;
4141
import static org.junit.jupiter.api.Assertions.assertNull;
42+
import static org.junit.jupiter.api.Assertions.assertTrue;
4243

4344
public class GLImageFormatsTest {
4445

@@ -56,20 +57,29 @@ public void testGles3UsesCoreHalfFloatType() {
5657
}
5758

5859
@Test
59-
public void testGles3DoesNotExposeDesktopByteOrderFormats() {
60+
public void testGles3ExposesByteOrderFormatsViaSwizzle() {
6061
EnumSet<Caps> caps = EnumSet.of(Caps.OpenGLES20, Caps.OpenGLES30,
6162
Caps.CoreProfile, Caps.Srgb);
6263

6364
GLImageFormat[][] formats = GLImageFormats.getFormatsForCaps(caps);
6465

65-
assertNull(formats[0][Image.Format.BGR8.ordinal()]);
66-
assertNull(formats[0][Image.Format.ABGR8.ordinal()]);
67-
assertNull(formats[0][Image.Format.ARGB8.ordinal()]);
68-
assertNull(formats[0][Image.Format.BGRA8.ordinal()]);
69-
assertNull(formats[1][Image.Format.BGR8.ordinal()]);
70-
assertNull(formats[1][Image.Format.ABGR8.ordinal()]);
71-
assertNull(formats[1][Image.Format.ARGB8.ordinal()]);
72-
assertNull(formats[1][Image.Format.BGRA8.ordinal()]);
66+
assertGles3SwizzledFormat(formats[0][Image.Format.BGR8.ordinal()],
67+
GL2.GL_RGB8, GL.GL_RGB, GL.GL_UNSIGNED_BYTE, true);
68+
assertGles3SwizzledFormat(formats[0][Image.Format.ARGB8.ordinal()],
69+
GLExt.GL_RGBA8, GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, true);
70+
assertGles3SwizzledFormat(formats[0][Image.Format.BGRA8.ordinal()],
71+
GLExt.GL_RGBA8, GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, true);
72+
assertGles3SwizzledFormat(formats[0][Image.Format.ABGR8.ordinal()],
73+
GLExt.GL_RGBA8, GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, true);
74+
75+
assertGles3SwizzledFormat(formats[1][Image.Format.BGR8.ordinal()],
76+
GLExt.GL_SRGB8_EXT, GL.GL_RGB, GL.GL_UNSIGNED_BYTE, false);
77+
assertGles3SwizzledFormat(formats[1][Image.Format.ARGB8.ordinal()],
78+
GLExt.GL_SRGB8_ALPHA8_EXT, GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, true);
79+
assertGles3SwizzledFormat(formats[1][Image.Format.BGRA8.ordinal()],
80+
GLExt.GL_SRGB8_ALPHA8_EXT, GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, true);
81+
assertGles3SwizzledFormat(formats[1][Image.Format.ABGR8.ordinal()],
82+
GLExt.GL_SRGB8_ALPHA8_EXT, GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, true);
7383
}
7484

7585
@Test
@@ -130,4 +140,14 @@ public void testDepthFormatsFollowExplicitCaps() {
130140

131141
assertNotNull(formats[0][Image.Format.Depth32.ordinal()]);
132142
}
143+
144+
private static void assertGles3SwizzledFormat(GLImageFormat format, int internalFormat,
145+
int glFormat, int dataType, boolean colorRenderable) {
146+
assertNotNull(format);
147+
assertEquals(internalFormat, format.internalFormat);
148+
assertEquals(glFormat, format.format);
149+
assertEquals(dataType, format.dataType);
150+
assertEquals(colorRenderable, format.colorRenderable);
151+
assertTrue(format.swizzleRequired);
152+
}
133153
}

0 commit comments

Comments
 (0)