add 'shaderatomics' field to love.graphics.getTextureFormats' usage table arg.

Currently only r32i and r32ui are supported (on capable systems).
This commit is contained in:
Sasha Szpakowski
2026-07-24 14:23:55 -03:00
parent 8c18d3ce8e
commit e4649253e8
4 changed files with 26 additions and 6 deletions
+8 -6
View File
@@ -60,12 +60,13 @@ enum TextureType
enum PixelFormatUsage
{
PIXELFORMATUSAGE_SAMPLE, // Any sampling in shaders.
PIXELFORMATUSAGE_LINEAR, // Linear filtering.
PIXELFORMATUSAGE_RENDERTARGET, // Usable as a render target.
PIXELFORMATUSAGE_BLEND, // Blend support when used as a render target.
PIXELFORMATUSAGE_MSAA, // MSAA support when used as a render target.
PIXELFORMATUSAGE_COMPUTEWRITE, // Writable in compute shaders via imageStore.
PIXELFORMATUSAGE_SAMPLE, // Any sampling in shaders.
PIXELFORMATUSAGE_LINEAR, // Linear filtering.
PIXELFORMATUSAGE_RENDERTARGET, // Usable as a render target.
PIXELFORMATUSAGE_BLEND, // Blend support when used as a render target.
PIXELFORMATUSAGE_MSAA, // MSAA support when used as a render target.
PIXELFORMATUSAGE_COMPUTEWRITE, // Writable in compute shaders via imageStore.
PIXELFORMATUSAGE_SHADERATOMICS, // Supports atomic load/store in compute shaders.
PIXELFORMATUSAGE_MAX_ENUM
};
@@ -78,6 +79,7 @@ enum PixelFormatUsageFlags
PIXELFORMATUSAGEFLAGS_BLEND = (1 << PIXELFORMATUSAGE_BLEND),
PIXELFORMATUSAGEFLAGS_MSAA = (1 << PIXELFORMATUSAGE_MSAA),
PIXELFORMATUSAGEFLAGS_COMPUTEWRITE = (1 << PIXELFORMATUSAGE_COMPUTEWRITE),
PIXELFORMATUSAGEFLAGS_SHADERATOMICS = (1 << PIXELFORMATUSAGE_SHADERATOMICS),
};
struct SamplerState
+5
View File
@@ -1990,6 +1990,11 @@ uint32 OpenGL::getPixelFormatUsageFlags(PixelFormat pixelformat)
case PIXELFORMAT_RGBA32_UINT:
case PIXELFORMAT_RGB10A2_UINT:
flags |= PIXELFORMATUSAGEFLAGS_SAMPLE | PIXELFORMATUSAGEFLAGS_RENDERTARGET;
if (pixelformat == PIXELFORMAT_R32_INT || pixelformat == PIXELFORMAT_R32_UINT)
{
if (GLAD_VERSION_4_3 || GLAD_ES_VERSION_3_2)
flags |= PIXELFORMATUSAGEFLAGS_SHADERATOMICS;
}
if (GLAD_VERSION_4_3)
flags |= computewrite;
if (GLAD_ES_VERSION_3_1)
+10
View File
@@ -1237,6 +1237,16 @@ bool Graphics::isPixelFormatSupported(PixelFormat format, uint32 usage)
return false;
}
if (usage & PIXELFORMATUSAGEFLAGS_SHADERATOMICS)
{
if (!(featureFlags & VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT))
return false;
// TODO: supporting float formats when available may need GLSL extensions.
if (format != PIXELFORMAT_R32_INT && format != PIXELFORMAT_R32_UINT)
return false;
}
if (usage & PIXELFORMATUSAGEFLAGS_MSAA)
{
VkImageFormatProperties properties;
+3
View File
@@ -3007,6 +3007,7 @@ int w_getTextureFormats(lua_State *L)
bool rt = luax_checkboolflag(L, 1, Texture::getConstant(Texture::SETTING_RENDER_TARGET));
bool computewrite = luax_boolflag(L, 1, Texture::getConstant(Texture::SETTING_COMPUTE_WRITE), false);
bool shaderatomics = luax_boolflag(L, 1, "shaderatomics", false);
OptionalBool readable;
lua_getfield(L, 1, Texture::getConstant(Texture::SETTING_READABLE));
@@ -3034,6 +3035,8 @@ int w_getTextureFormats(lua_State *L)
usage |= PIXELFORMATUSAGEFLAGS_SAMPLE;
if (computewrite)
usage |= PIXELFORMATUSAGEFLAGS_COMPUTEWRITE;
if (shaderatomics)
usage |= PIXELFORMATUSAGEFLAGS_SHADERATOMICS;
luax_pushboolean(L, instance()->isPixelFormatSupported(format, (PixelFormatUsageFlags) usage));
lua_setfield(L, -2, name);