Browse Source

Add a GraphicsFeature support enum for 32 bit index buffers.

Some old OpenGL ES 2 systems don't support them.
Alex Szpakowski 3 years ago
parent
commit
42e8df1489

+ 3 - 0
src/modules/graphics/Buffer.cpp

@@ -76,6 +76,9 @@ Buffer::Buffer(Graphics *gfx, const Settings &settings, const std::vector<DataDe
 
 
 		if (indexbuffer)
 		if (indexbuffer)
 		{
 		{
+			if (!caps.features[Graphics::FEATURE_INDEX_BUFFER_32BIT] && format == DATAFORMAT_UINT32)
+				throw love::Exception("32 bit index buffer formats are not supported on this system.");
+
 			if (format != DATAFORMAT_UINT16 && format != DATAFORMAT_UINT32)
 			if (format != DATAFORMAT_UINT16 && format != DATAFORMAT_UINT32)
 				throw love::Exception("Index buffers only support uint16 and uint32 data types.");
 				throw love::Exception("Index buffers only support uint16 and uint32 data types.");
 
 

+ 2 - 1
src/modules/graphics/Graphics.cpp

@@ -1560,7 +1560,7 @@ void Graphics::drawShaderVertices(Buffer *indexbuffer, int indexcount, int insta
 	if (indexcount < 0 || instancecount < 0)
 	if (indexcount < 0 || instancecount < 0)
 		throw love::Exception("drawShaderVertices index and instance count parameters must not be negative.");
 		throw love::Exception("drawShaderVertices index and instance count parameters must not be negative.");
 
 
-	if ((size_t)(startindex + indexcount) > indexbuffer->getArrayLength())
+	if ((size_t)(startindex + indexcount) > indexbuffer->getArrayLength() * indexbuffer->getDataMembers().size())
 		throw love::Exception("drawShaderVertices startindex and index count parameters do not fit in the given index buffer.");
 		throw love::Exception("drawShaderVertices startindex and index count parameters do not fit in the given index buffer.");
 
 
 	if (Shader::isDefaultActive() || !Shader::current)
 	if (Shader::isDefaultActive() || !Shader::current)
@@ -2137,6 +2137,7 @@ STRINGMAP_CLASS_BEGIN(Graphics, Graphics::Feature, Graphics::FEATURE_MAX_ENUM, f
 	{ "glsl4",                    Graphics::FEATURE_GLSL4                },
 	{ "glsl4",                    Graphics::FEATURE_GLSL4                },
 	{ "instancing",               Graphics::FEATURE_INSTANCING           },
 	{ "instancing",               Graphics::FEATURE_INSTANCING           },
 	{ "texelbuffer",              Graphics::FEATURE_TEXEL_BUFFER         },
 	{ "texelbuffer",              Graphics::FEATURE_TEXEL_BUFFER         },
+	{ "indexbuffer32bit",         Graphics::FEATURE_INDEX_BUFFER_32BIT   },
 	{ "copybuffer",               Graphics::FEATURE_COPY_BUFFER          },
 	{ "copybuffer",               Graphics::FEATURE_COPY_BUFFER          },
 	{ "copybuffertotexture",      Graphics::FEATURE_COPY_BUFFER_TO_TEXTURE },
 	{ "copybuffertotexture",      Graphics::FEATURE_COPY_BUFFER_TO_TEXTURE },
 	{ "copytexturetobuffer",      Graphics::FEATURE_COPY_TEXTURE_TO_BUFFER },
 	{ "copytexturetobuffer",      Graphics::FEATURE_COPY_TEXTURE_TO_BUFFER },

+ 1 - 0
src/modules/graphics/Graphics.h

@@ -144,6 +144,7 @@ public:
 		FEATURE_GLSL4,
 		FEATURE_GLSL4,
 		FEATURE_INSTANCING,
 		FEATURE_INSTANCING,
 		FEATURE_TEXEL_BUFFER,
 		FEATURE_TEXEL_BUFFER,
+		FEATURE_INDEX_BUFFER_32BIT,
 		FEATURE_COPY_BUFFER,
 		FEATURE_COPY_BUFFER,
 		FEATURE_COPY_BUFFER_TO_TEXTURE,
 		FEATURE_COPY_BUFFER_TO_TEXTURE,
 		FEATURE_COPY_TEXTURE_TO_BUFFER,
 		FEATURE_COPY_TEXTURE_TO_BUFFER,

+ 2 - 1
src/modules/graphics/opengl/Graphics.cpp

@@ -1639,11 +1639,12 @@ void Graphics::initCapabilities()
 	capabilities.features[FEATURE_GLSL4] = GLAD_ES_VERSION_3_1 || (gl.isCoreProfile() && GLAD_VERSION_4_3);
 	capabilities.features[FEATURE_GLSL4] = GLAD_ES_VERSION_3_1 || (gl.isCoreProfile() && GLAD_VERSION_4_3);
 	capabilities.features[FEATURE_INSTANCING] = gl.isInstancingSupported();
 	capabilities.features[FEATURE_INSTANCING] = gl.isInstancingSupported();
 	capabilities.features[FEATURE_TEXEL_BUFFER] = gl.isBufferUsageSupported(BUFFERUSAGE_TEXEL);
 	capabilities.features[FEATURE_TEXEL_BUFFER] = gl.isBufferUsageSupported(BUFFERUSAGE_TEXEL);
+	capabilities.features[FEATURE_INDEX_BUFFER_32BIT] = GLAD_VERSION_1_1 || GLAD_ES_VERSION_3_0 || GLAD_OES_element_index_uint;
 	capabilities.features[FEATURE_COPY_BUFFER] = gl.isCopyBufferSupported();
 	capabilities.features[FEATURE_COPY_BUFFER] = gl.isCopyBufferSupported();
 	capabilities.features[FEATURE_COPY_BUFFER_TO_TEXTURE] = gl.isCopyBufferToTextureSupported();
 	capabilities.features[FEATURE_COPY_BUFFER_TO_TEXTURE] = gl.isCopyBufferToTextureSupported();
 	capabilities.features[FEATURE_COPY_TEXTURE_TO_BUFFER] = gl.isCopyTextureToBufferSupported();
 	capabilities.features[FEATURE_COPY_TEXTURE_TO_BUFFER] = gl.isCopyTextureToBufferSupported();
 	capabilities.features[FEATURE_COPY_RENDER_TARGET_TO_BUFFER] = gl.isCopyRenderTargetToBufferSupported();
 	capabilities.features[FEATURE_COPY_RENDER_TARGET_TO_BUFFER] = gl.isCopyRenderTargetToBufferSupported();
-	static_assert(FEATURE_MAX_ENUM == 15, "Graphics::initCapabilities must be updated when adding a new graphics feature!");
+	static_assert(FEATURE_MAX_ENUM == 16, "Graphics::initCapabilities must be updated when adding a new graphics feature!");
 
 
 	capabilities.limits[LIMIT_POINT_SIZE] = gl.getMaxPointSize();
 	capabilities.limits[LIMIT_POINT_SIZE] = gl.getMaxPointSize();
 	capabilities.limits[LIMIT_TEXTURE_SIZE] = gl.getMax2DTextureSize();
 	capabilities.limits[LIMIT_TEXTURE_SIZE] = gl.getMax2DTextureSize();