return { tag = 'graphics-misc', summary = 'Get the limits of the current GPU.', description = 'Returns limits of the current GPU.', arguments = {}, returns = { limits = { type = 'table', description = '', table = { { name = 'textureSize2D', type = 'number', description = 'The maximum width/height of `2d` and `array` textures.' }, { name = 'textureSize3D', type = 'number', description = 'The maximum width/height/depth of `3d` textures.' }, { name = 'textureSizeCube', type = 'number', description = 'The maximum width/height of `cube` textures.' }, { name = 'textureLayers', type = 'number', description = 'The maximum depth of `array` textures.' }, { name = 'renderSize', type = 'table', description = [[ The maximum width, height, and layer count of a texture (or texture view) used as a render target. ]] }, { name = 'uniformBuffersPerStage', type = 'number', description = 'The maximum number of uniform buffers in a shader stage.' }, { name = 'storageBuffersPerStage', type = 'number', description = 'The maximum number of storage buffers in a shader stage.' }, { name = 'sampledTexturesPerStage', type = 'number', description = 'The maximum number of sampled textures in a shader stage.' }, { name = 'storageTexturesPerStage', type = 'number', description = 'The maximum number of storage textures in a shader stage.' }, { name = 'samplersPerStage', type = 'number', description = 'The maximum number of samplers in a shader stage.' }, { name = 'resourcesPerShader', type = 'number', description = [[ The maximum combined number of buffers, textures, and sampler variables in a Shader. ]] }, { name = 'uniformBufferRange', type = 'number', description = [[ The maximum range of bytes that can be bound to a uniform buffer in a shader. ]] }, { name = 'storageBufferRange', type = 'number', description = [[ The maximum range of bytes that can be bound to a storage buffer in a shader. ]] }, { name = 'uniformBufferAlign', type = 'number', description = [[ When binding a range of bytes to a uniform buffer binding in a shader, the byte offset of the range must be a multiple of this limit's value. ]] }, { name = 'storageBufferAlign', type = 'number', description = [[ When binding a range of bytes to a storage buffer binding in a shader, the byte offset of the range must be a multiple of this limit's value. ]] }, { name = 'vertexAttributes', type = 'number', description = 'The maximum number of input attributes in a vertex shader.' }, { name = 'vertexBufferStride', type = 'number', description = 'The maximum stride of a buffer used as a vertex buffer, in bytes.' }, { name = 'vertexShaderOutputs', type = 'number', description = 'The maximum number of components output from a vertex shader.' }, { name = 'clipDistances', type = 'number', description = 'The maximum number of clipping planes declared by a shader.' }, { name = 'cullDistances', type = 'number', description = 'The maximum number of cull distances declared by a shader.' }, { name = 'clipAndCullDistances', type = 'number', description = [[ The maximum number of clipping planes and cull distances declared by a shader. ]] }, { name = 'workgroupCount', type = 'table', description = 'The maximum values of `x`, `y`, and `z` in `Pass:compute`.' }, { name = 'workgroupSize', type = 'table', description = [[ The maximum values of `local_size_x`, `local_size_y`, and `local_size_z` declared in a compute shader. ]] }, { name = 'totalWorkgroupSize', type = 'number', description = [[ The maximum product of `local_size_x`, `local_size_y`, and `local_size_z` in a compute shader. ]] }, { name = 'computeSharedMemory', type = 'number', description = 'The maximum number of bytes used by `shared` variables in compute shaders.' }, { name = 'shaderConstantSize', type = 'number', description = [[ The maximum number of bytes of push constants that can be in a Shader. Push constants are shared between stages, so the stage with the largest amount of push constant data will count towards this limit. ]] }, { name = 'indirectDrawCount', type = 'number', description = 'The maximum number of draws that can be issued by an indirect draw call.' }, { name = 'instances', type = 'number', description = 'The maximum number of instances that can be rendered in a draw call.' }, { name = 'anisotropy', type = 'number', description = [[ The maximum value of the `anisotropy` parameter in `lovr.graphics.newSampler`. ]] }, { name = 'pointSize', type = 'number', description = 'The maximum point size.' } } } }, variants = { { arguments = {}, returns = { 'limits' } } }, notes = [[ The limit ranges are as follows:
| Limit | Minimum | Maximum |
textureSize2D |
4096 | |
textureSize3D |
256 | |
textureSizeCube |
4096 | |
textureLayers |
256 | |
renderSize |
{ 4096, 4096, 6 } | |
uniformBuffersPerStage |
9 | 32* |
storageBuffersPerStage |
4 | 32* |
sampledTexturesPerStage |
32 | 32* |
storageTexturesPerStage |
4 | 32* |
samplersPerStage |
15 | 32* |
resourcesPerShader |
32 | 32* |
uniformBufferRange |
65536 | |
storageBufferRange |
134217728 (128MB) | 1073741824 (1GB)* |
uniformBufferAlign |
256 | |
storageBufferAlign |
64 | |
vertexAttributes |
16 | 16* |
vertexBufferStride |
2048 | 65535* |
vertexShaderOutputs |
64 | |
clipDistances |
0 | |
cullDistances |
0 | |
clipAndCullDistances |
0 | |
computeDispatchCount |
{ 65536, 65536, 65536 } | |
computeWorkgroupSize |
{ 128, 128, 64 } | |
computeWorkgroupVolume |
128 | |
computeSharedMemory |
16384 (16KB) | |
pushConstantSize |
128 | 256* |
indirectDrawCount |
1 | |
instances |
134217727 | |
anisotropy |
0.0 | |
pointSize |
1.0 |