From f246fd29fa3a35439a316e31b071dbb7d44af21d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Branimir=20Karad=C5=BEi=C4=87?= Date: Tue, 21 Apr 2015 15:44:16 -0700 Subject: [PATCH] Added texture caps flag for compute image formats. --- include/bgfxdefines.h | 1 + src/bgfx.cpp | 10 ++++++---- src/renderer_d3d11.cpp | 27 +++++++++++++++++++++++++++ src/renderer_gl.cpp | 22 +++++++++++++++++++--- 4 files changed, 53 insertions(+), 7 deletions(-) diff --git a/include/bgfxdefines.h b/include/bgfxdefines.h index dc51503f..012a1ee1 100644 --- a/include/bgfxdefines.h +++ b/include/bgfxdefines.h @@ -325,6 +325,7 @@ #define BGFX_CAPS_FORMAT_TEXTURE_COLOR UINT8_C(0x01) #define BGFX_CAPS_FORMAT_TEXTURE_EMULATED UINT8_C(0x02) #define BGFX_CAPS_FORMAT_TEXTURE_VERTEX UINT8_C(0x04) +#define BGFX_CAPS_FORMAT_TEXTURE_IMAGE UINT8_C(0x08) /// #define BGFX_VIEW_NONE UINT8_C(0x00) diff --git a/src/bgfx.cpp b/src/bgfx.cpp index b55d9568..c4998a8f 100644 --- a/src/bgfx.cpp +++ b/src/bgfx.cpp @@ -847,18 +847,20 @@ namespace bgfx } BX_TRACE("Supported texture formats:"); - BX_TRACE("\t +------ x = supported / * = emulated"); - BX_TRACE("\t |+----- vertex format"); - BX_TRACE("\t || +-- name"); + BX_TRACE("\t +------- x = supported / * = emulated"); + BX_TRACE("\t |+------ vertex format"); + BX_TRACE("\t ||+----- image"); + BX_TRACE("\t ||| +-- name"); for (uint32_t ii = 0; ii < TextureFormat::Count; ++ii) { if (TextureFormat::Unknown != ii && TextureFormat::UnknownDepth != ii) { uint8_t flags = g_caps.formats[ii]; - BX_TRACE("\t[%c%c] %s" + BX_TRACE("\t[%c%c%c] %s" , flags&BGFX_CAPS_FORMAT_TEXTURE_COLOR ? 'x' : flags&BGFX_CAPS_FORMAT_TEXTURE_EMULATED ? '*' : ' ' , flags&BGFX_CAPS_FORMAT_TEXTURE_VERTEX ? 'v' : ' ' + , flags&BGFX_CAPS_FORMAT_TEXTURE_IMAGE ? 'i' : ' ' , getName(TextureFormat::Enum(ii) ) ); BX_UNUSED(flags); diff --git a/src/renderer_d3d11.cpp b/src/renderer_d3d11.cpp index 2ff11614..8daee47f 100644 --- a/src/renderer_d3d11.cpp +++ b/src/renderer_d3d11.cpp @@ -926,11 +926,38 @@ BX_PRAGMA_DIAGNOSTIC_POP(); ? BGFX_CAPS_FORMAT_TEXTURE_VERTEX : BGFX_CAPS_FORMAT_TEXTURE_NONE ; + + support |= 0 != (data.OutFormatSupport & (0 + | D3D11_FORMAT_SUPPORT_SHADER_LOAD + ) ) + ? BGFX_CAPS_FORMAT_TEXTURE_IMAGE + : BGFX_CAPS_FORMAT_TEXTURE_NONE + ; } else { BX_TRACE("CheckFeatureSupport failed with %x for format %s.", hr, getName(TextureFormat::Enum(ii) ) ); } + + if (0 != (support & BGFX_CAPS_FORMAT_TEXTURE_IMAGE) ) + { + // clear image flag for additional testing + support &= ~BGFX_CAPS_FORMAT_TEXTURE_IMAGE; + + D3D11_FEATURE_DATA_FORMAT_SUPPORT data; // D3D11_FEATURE_DATA_FORMAT_SUPPORT2 + data.InFormat = s_textureFormat[ii].m_fmt; + hr = m_device->CheckFeatureSupport(D3D11_FEATURE_FORMAT_SUPPORT2, &data, sizeof(data) ); + if (SUCCEEDED(hr) ) + { + support |= 0 != (data.OutFormatSupport & (0 + | D3D11_FORMAT_SUPPORT2_UAV_TYPED_LOAD + | D3D11_FORMAT_SUPPORT2_UAV_TYPED_STORE + ) ) + ? BGFX_CAPS_FORMAT_TEXTURE_IMAGE + : BGFX_CAPS_FORMAT_TEXTURE_NONE + ; + } + } } g_caps.formats[ii] = support; diff --git a/src/renderer_gl.cpp b/src/renderer_gl.cpp index 78ebf432..fa0011bb 100644 --- a/src/renderer_gl.cpp +++ b/src/renderer_gl.cpp @@ -1325,9 +1325,26 @@ namespace bgfx { namespace gl } } + const bool computeSupport = false + || !!(BGFX_CONFIG_RENDERER_OPENGLES >= 31) + || s_extension[Extension::ARB_compute_shader].m_supported + ; + for (uint32_t ii = 0; ii < TextureFormat::Count; ++ii) { - g_caps.formats[ii] = s_textureFormat[ii].m_supported ? 1 : 0; + uint8_t supported = 0; + supported |= s_textureFormat[ii].m_supported + ? BGFX_CAPS_FORMAT_TEXTURE_COLOR + : BGFX_CAPS_FORMAT_TEXTURE_NONE + ; + + supported |= computeSupport + && GL_ZERO != s_imageFormat[ii] + ? BGFX_CAPS_FORMAT_TEXTURE_IMAGE + : BGFX_CAPS_FORMAT_TEXTURE_NONE + ; + + g_caps.formats[ii] = supported; } g_caps.supported |= !!(BGFX_CONFIG_RENDERER_OPENGL || BGFX_CONFIG_RENDERER_OPENGLES >= 30) @@ -1436,8 +1453,7 @@ namespace bgfx { namespace gl : 0 ; - g_caps.supported |= !!(BGFX_CONFIG_RENDERER_OPENGLES >= 31) - || s_extension[Extension::ARB_compute_shader].m_supported + g_caps.supported |= computeSupport ? BGFX_CAPS_COMPUTE : 0 ;