[Mesa-dev] [PATCH v2] swr: [rasterizer common/core/jitter] fetch support for GL_FIXED
Cherniak, Bruce
bruce.cherniak at intel.com
Thu Dec 8 02:43:26 UTC 2016
Reviewed-by: Bruce Cherniak <bruce.cherniak at intel.com>
> On Dec 7, 2016, at 7:16 PM, Tim Rowley <timothy.o.rowley at intel.com> wrote:
>
> v2: use fmul(1/65536) instead of fdiv(65535)
> ---
> .../drivers/swr/rasterizer/common/formats.cpp | 104 ++++++++++++++-------
> .../drivers/swr/rasterizer/common/formats.h | 7 +-
> .../drivers/swr/rasterizer/core/format_traits.h | 90 +++++++++++++++++-
> .../drivers/swr/rasterizer/jitter/fetch_jit.cpp | 12 +++
> src/gallium/drivers/swr/swr_screen.cpp | 9 ++
> 5 files changed, 188 insertions(+), 34 deletions(-)
>
> diff --git a/src/gallium/drivers/swr/rasterizer/common/formats.cpp b/src/gallium/drivers/swr/rasterizer/common/formats.cpp
> index b3a95f2..aba4c3f 100644
> --- a/src/gallium/drivers/swr/rasterizer/common/formats.cpp
> +++ b/src/gallium/drivers/swr/rasterizer/common/formats.cpp
> @@ -449,16 +449,26 @@ const SWR_FORMAT_INFO gFormatInfo[] = {
> { 0.0f, 0.0f, 0.0f, 0.0f },
> 1, 1
> },
> - // padding (0x20)
> + // R32G32B32A32_SFIXED (0x20)
> {
> - nullptr,
> - { SWR_TYPE_UNKNOWN, SWR_TYPE_UNKNOWN, SWR_TYPE_UNKNOWN, SWR_TYPE_UNKNOWN },
> - { 0, 0, 0, 0 },{ 0, 0, 0, 0 },{ 0, 0, 0, 0 },
> - 0, 0, 0, false, false, false, false,
> - { false, false, false, false },
> - { 0.0f, 0.0f, 0.0f, 0.0f },
> - 1, 1
> + "R32G32B32A32_SFIXED",
> + { SWR_TYPE_SFIXED, SWR_TYPE_SFIXED, SWR_TYPE_SFIXED, SWR_TYPE_SFIXED },
> + { 0, 0, 0, 0x3f800000 }, // Defaults for missing components
> + { 0, 1, 2, 3 }, // Swizzle
> + { 32, 32, 32, 32 }, // Bits per component
> + 128, // Bits per element
> + 16, // Bytes per element
> + 4, // Num components
> + false, // isSRGB
> + false, // isBC
> + false, // isSubsampled
> + false, // isLuminance
> + { false, false, false, false }, // Is normalized?
> + { 1.0f, 1.0f, 1.0f, 1.0f }, // To float scale factor
> + 1, // bcWidth
> + 1, // bcHeight
> },
> +
> // padding (0x21)
> {
> nullptr,
> @@ -979,16 +989,26 @@ const SWR_FORMAT_INFO gFormatInfo[] = {
> { 0.0f, 0.0f, 0.0f, 0.0f },
> 1, 1
> },
> - // padding (0x50)
> + // R32G32B32_SFIXED (0x50)
> {
> - nullptr,
> - { SWR_TYPE_UNKNOWN, SWR_TYPE_UNKNOWN, SWR_TYPE_UNKNOWN, SWR_TYPE_UNKNOWN },
> - { 0, 0, 0, 0 },{ 0, 0, 0, 0 },{ 0, 0, 0, 0 },
> - 0, 0, 0, false, false, false, false,
> - { false, false, false, false },
> - { 0.0f, 0.0f, 0.0f, 0.0f },
> - 1, 1
> + "R32G32B32_SFIXED",
> + { SWR_TYPE_SFIXED, SWR_TYPE_SFIXED, SWR_TYPE_SFIXED, SWR_TYPE_UNKNOWN },
> + { 0, 0, 0, 0x3f800000 }, // Defaults for missing components
> + { 0, 1, 2, 0 }, // Swizzle
> + { 32, 32, 32, 0 }, // Bits per component
> + 96, // Bits per element
> + 12, // Bytes per element
> + 3, // Num components
> + false, // isSRGB
> + false, // isBC
> + false, // isSubsampled
> + false, // isLuminance
> + { false, false, false, false }, // Is normalized?
> + { 1.0f, 1.0f, 1.0f, 0 }, // To float scale factor
> + 1, // bcWidth
> + 1, // bcHeight
> },
> +
> // padding (0x51)
> {
> nullptr,
> @@ -1969,16 +1989,26 @@ const SWR_FORMAT_INFO gFormatInfo[] = {
> { 0.0f, 0.0f, 0.0f, 0.0f },
> 1, 1
> },
> - // padding (0xA0)
> + // R32G32_SFIXED (0xA0)
> {
> - nullptr,
> - { SWR_TYPE_UNKNOWN, SWR_TYPE_UNKNOWN, SWR_TYPE_UNKNOWN, SWR_TYPE_UNKNOWN },
> - { 0, 0, 0, 0 },{ 0, 0, 0, 0 },{ 0, 0, 0, 0 },
> - 0, 0, 0, false, false, false, false,
> - { false, false, false, false },
> - { 0.0f, 0.0f, 0.0f, 0.0f },
> - 1, 1
> + "R32G32_SFIXED",
> + { SWR_TYPE_SFIXED, SWR_TYPE_SFIXED, SWR_TYPE_UNKNOWN, SWR_TYPE_UNKNOWN },
> + { 0, 0, 0, 0x3f800000 }, // Defaults for missing components
> + { 0, 1, 0, 0 }, // Swizzle
> + { 32, 32, 0, 0 }, // Bits per component
> + 64, // Bits per element
> + 8, // Bytes per element
> + 2, // Num components
> + false, // isSRGB
> + false, // isBC
> + false, // isSubsampled
> + false, // isLuminance
> + { false, false, false, false }, // Is normalized?
> + { 1.0f, 1.0f, 0, 0 }, // To float scale factor
> + 1, // bcWidth
> + 1, // bcHeight
> },
> +
> // padding (0xA1)
> {
> nullptr,
> @@ -5909,16 +5939,26 @@ const SWR_FORMAT_INFO gFormatInfo[] = {
> 1, // bcHeight
> },
>
> - // padding (0x1B2)
> + // R32_SFIXED (0x1B2)
> {
> - nullptr,
> - { SWR_TYPE_UNKNOWN, SWR_TYPE_UNKNOWN, SWR_TYPE_UNKNOWN, SWR_TYPE_UNKNOWN },
> - { 0, 0, 0, 0 },{ 0, 0, 0, 0 },{ 0, 0, 0, 0 },
> - 0, 0, 0, false, false, false, false,
> - { false, false, false, false },
> - { 0.0f, 0.0f, 0.0f, 0.0f },
> - 1, 1
> + "R32_SFIXED",
> + { SWR_TYPE_SFIXED, SWR_TYPE_UNKNOWN, SWR_TYPE_UNKNOWN, SWR_TYPE_UNKNOWN },
> + { 0, 0, 0, 0x3f800000 }, // Defaults for missing components
> + { 0, 0, 0, 0 }, // Swizzle
> + { 32, 0, 0, 0 }, // Bits per component
> + 32, // Bits per element
> + 4, // Bytes per element
> + 1, // Num components
> + false, // isSRGB
> + false, // isBC
> + false, // isSubsampled
> + false, // isLuminance
> + { false, false, false, false }, // Is normalized?
> + { 1.0f, 0, 0, 0 }, // To float scale factor
> + 1, // bcWidth
> + 1, // bcHeight
> },
> +
> // R10G10B10A2_SNORM (0x1B3)
> {
> "R10G10B10A2_SNORM",
> diff --git a/src/gallium/drivers/swr/rasterizer/common/formats.h b/src/gallium/drivers/swr/rasterizer/common/formats.h
> index dd5b499..3d686d3 100644
> --- a/src/gallium/drivers/swr/rasterizer/common/formats.h
> +++ b/src/gallium/drivers/swr/rasterizer/common/formats.h
> @@ -20,7 +20,7 @@
> * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
> * IN THE SOFTWARE.
> *
> -* @file formats.h
> +* @file gen_formats.h
> *
> * @brief auto-generated file
> *
> @@ -46,6 +46,7 @@ enum SWR_TYPE
> SWR_TYPE_FLOAT,
> SWR_TYPE_SSCALED,
> SWR_TYPE_USCALED,
> + SWR_TYPE_SFIXED,
> };
>
> //////////////////////////////////////////////////////////////////////////
> @@ -59,11 +60,13 @@ enum SWR_FORMAT
> R32G32B32X32_FLOAT = 0x6,
> R32G32B32A32_SSCALED = 0x7,
> R32G32B32A32_USCALED = 0x8,
> + R32G32B32A32_SFIXED = 0x20,
> R32G32B32_FLOAT = 0x40,
> R32G32B32_SINT = 0x41,
> R32G32B32_UINT = 0x42,
> R32G32B32_SSCALED = 0x45,
> R32G32B32_USCALED = 0x46,
> + R32G32B32_SFIXED = 0x50,
> R16G16B16A16_UNORM = 0x80,
> R16G16B16A16_SNORM = 0x81,
> R16G16B16A16_SINT = 0x82,
> @@ -83,6 +86,7 @@ enum SWR_FORMAT
> R16G16B16A16_USCALED = 0x94,
> R32G32_SSCALED = 0x95,
> R32G32_USCALED = 0x96,
> + R32G32_SFIXED = 0xA0,
> B8G8R8A8_UNORM = 0xC0,
> B8G8R8A8_UNORM_SRGB = 0xC1,
> R10G10B10A2_UNORM = 0xC2,
> @@ -203,6 +207,7 @@ enum SWR_FORMAT
> R8G8B8_UNORM_SRGB = 0x1A8,
> R16G16B16_UINT = 0x1B0,
> R16G16B16_SINT = 0x1B1,
> + R32_SFIXED = 0x1B2,
> R10G10B10A2_SNORM = 0x1B3,
> R10G10B10A2_USCALED = 0x1B4,
> R10G10B10A2_SSCALED = 0x1B5,
> diff --git a/src/gallium/drivers/swr/rasterizer/core/format_traits.h b/src/gallium/drivers/swr/rasterizer/core/format_traits.h
> index d55ee1f..59d4e7d 100644
> --- a/src/gallium/drivers/swr/rasterizer/core/format_traits.h
> +++ b/src/gallium/drivers/swr/rasterizer/core/format_traits.h
> @@ -20,7 +20,7 @@
> * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
> * IN THE SOFTWARE.
> *
> -* @file format_traits.h
> +* @file gen_format_traits.h
> *
> * @brief Format Traits. auto-generated file
> *
> @@ -200,6 +200,28 @@ template<> struct FormatTraits<R32G32B32A32_USCALED> :
> };
>
> //////////////////////////////////////////////////////////////////////////
> +/// FormatTraits<R32G32B32A32_SFIXED> - Format traits specialization for R32G32B32A32_SFIXED
> +//////////////////////////////////////////////////////////////////////////
> +template<> struct FormatTraits<R32G32B32A32_SFIXED> :
> + ComponentTraits<SWR_TYPE_SFIXED, 32, SWR_TYPE_SFIXED, 32, SWR_TYPE_SFIXED, 32, SWR_TYPE_SFIXED, 32>,
> + FormatSwizzle<0, 1, 2, 3>,
> + Defaults<0, 0, 0, 0x3f800000>
> +{
> + static const uint32_t bpp{ 128 };
> + static const uint32_t numComps{ 4 };
> + static const bool hasAlpha{ true };
> + static const uint32_t alphaComp{ 3 };
> + static const bool isSRGB{ false };
> + static const bool isBC{ false };
> + static const bool isSubsampled{ false };
> + static const uint32_t bcWidth{ 1 };
> + static const uint32_t bcHeight{ 1 };
> +
> + typedef Transpose32_32_32_32 TransposeT;
> + typedef Format4<32, 32, 32, 32> FormatT;
> +};
> +
> +//////////////////////////////////////////////////////////////////////////
> /// FormatTraits<R32G32B32_FLOAT> - Format traits specialization for R32G32B32_FLOAT
> //////////////////////////////////////////////////////////////////////////
> template<> struct FormatTraits<R32G32B32_FLOAT> :
> @@ -310,6 +332,28 @@ template<> struct FormatTraits<R32G32B32_USCALED> :
> };
>
> //////////////////////////////////////////////////////////////////////////
> +/// FormatTraits<R32G32B32_SFIXED> - Format traits specialization for R32G32B32_SFIXED
> +//////////////////////////////////////////////////////////////////////////
> +template<> struct FormatTraits<R32G32B32_SFIXED> :
> + ComponentTraits<SWR_TYPE_SFIXED, 32, SWR_TYPE_SFIXED, 32, SWR_TYPE_SFIXED, 32>,
> + FormatSwizzle<0, 1, 2>,
> + Defaults<0, 0, 0, 0x3f800000>
> +{
> + static const uint32_t bpp{ 96 };
> + static const uint32_t numComps{ 3 };
> + static const bool hasAlpha{ false };
> + static const uint32_t alphaComp{ 0 };
> + static const bool isSRGB{ false };
> + static const bool isBC{ false };
> + static const bool isSubsampled{ false };
> + static const uint32_t bcWidth{ 1 };
> + static const uint32_t bcHeight{ 1 };
> +
> + typedef Transpose32_32_32 TransposeT;
> + typedef Format3<32, 32, 32> FormatT;
> +};
> +
> +//////////////////////////////////////////////////////////////////////////
> /// FormatTraits<R16G16B16A16_UNORM> - Format traits specialization for R16G16B16A16_UNORM
> //////////////////////////////////////////////////////////////////////////
> template<> struct FormatTraits<R16G16B16A16_UNORM> :
> @@ -728,6 +772,28 @@ template<> struct FormatTraits<R32G32_USCALED> :
> };
>
> //////////////////////////////////////////////////////////////////////////
> +/// FormatTraits<R32G32_SFIXED> - Format traits specialization for R32G32_SFIXED
> +//////////////////////////////////////////////////////////////////////////
> +template<> struct FormatTraits<R32G32_SFIXED> :
> + ComponentTraits<SWR_TYPE_SFIXED, 32, SWR_TYPE_SFIXED, 32>,
> + FormatSwizzle<0, 1>,
> + Defaults<0, 0, 0, 0x3f800000>
> +{
> + static const uint32_t bpp{ 64 };
> + static const uint32_t numComps{ 2 };
> + static const bool hasAlpha{ false };
> + static const uint32_t alphaComp{ 0 };
> + static const bool isSRGB{ false };
> + static const bool isBC{ false };
> + static const bool isSubsampled{ false };
> + static const uint32_t bcWidth{ 1 };
> + static const uint32_t bcHeight{ 1 };
> +
> + typedef Transpose32_32 TransposeT;
> + typedef Format2<32, 32> FormatT;
> +};
> +
> +//////////////////////////////////////////////////////////////////////////
> /// FormatTraits<B8G8R8A8_UNORM> - Format traits specialization for B8G8R8A8_UNORM
> //////////////////////////////////////////////////////////////////////////
> template<> struct FormatTraits<B8G8R8A8_UNORM> :
> @@ -3368,6 +3434,28 @@ template<> struct FormatTraits<R16G16B16_SINT> :
> };
>
> //////////////////////////////////////////////////////////////////////////
> +/// FormatTraits<R32_SFIXED> - Format traits specialization for R32_SFIXED
> +//////////////////////////////////////////////////////////////////////////
> +template<> struct FormatTraits<R32_SFIXED> :
> + ComponentTraits<SWR_TYPE_SFIXED, 32>,
> + FormatSwizzle<0>,
> + Defaults<0, 0, 0, 0x3f800000>
> +{
> + static const uint32_t bpp{ 32 };
> + static const uint32_t numComps{ 1 };
> + static const bool hasAlpha{ false };
> + static const uint32_t alphaComp{ 0 };
> + static const bool isSRGB{ false };
> + static const bool isBC{ false };
> + static const bool isSubsampled{ false };
> + static const uint32_t bcWidth{ 1 };
> + static const uint32_t bcHeight{ 1 };
> +
> + typedef TransposeSingleComponent<32> TransposeT;
> + typedef Format1<32> FormatT;
> +};
> +
> +//////////////////////////////////////////////////////////////////////////
> /// FormatTraits<R10G10B10A2_SNORM> - Format traits specialization for R10G10B10A2_SNORM
> //////////////////////////////////////////////////////////////////////////
> template<> struct FormatTraits<R10G10B10A2_SNORM> :
> diff --git a/src/gallium/drivers/swr/rasterizer/jitter/fetch_jit.cpp b/src/gallium/drivers/swr/rasterizer/jitter/fetch_jit.cpp
> index bdd818b..c5936e5 100644
> --- a/src/gallium/drivers/swr/rasterizer/jitter/fetch_jit.cpp
> +++ b/src/gallium/drivers/swr/rasterizer/jitter/fetch_jit.cpp
> @@ -46,6 +46,7 @@ enum ConversionType
> CONVERT_NORMALIZED,
> CONVERT_USCALED,
> CONVERT_SSCALED,
> + CONVERT_SFIXED,
> };
>
> //////////////////////////////////////////////////////////////////////////
> @@ -424,6 +425,9 @@ void FetchJit::JitLoadVertices(const FETCH_COMPILE_STATE &fetchState, Value* str
> case SWR_TYPE_SSCALED:
> vec = SI_TO_FP(vec, VectorType::get(mFP32Ty, 4));
> break;
> + case SWR_TYPE_SFIXED:
> + vec = FMUL(SI_TO_FP(vec, VectorType::get(mFP32Ty, 4)), VBROADCAST(C(1/65536.0f)));
> + break;
> case SWR_TYPE_UNKNOWN:
> case SWR_TYPE_UNUSED:
> SWR_ASSERT(false, "Unsupported type %d!", info.type[0]);
> @@ -943,6 +947,10 @@ void FetchJit::JitGatherVertices(const FETCH_COMPILE_STATE &fetchState,
> conversionType = CONVERT_SSCALED;
> extendCastType = Instruction::CastOps::SIToFP;
> break;
> + case SWR_TYPE_SFIXED:
> + conversionType = CONVERT_SFIXED;
> + extendCastType = Instruction::CastOps::SExt;
> + break;
> default:
> break;
> }
> @@ -1034,6 +1042,10 @@ void FetchJit::JitGatherVertices(const FETCH_COMPILE_STATE &fetchState,
> {
> pGather = SI_TO_FP(pGather, mSimdFP32Ty);
> }
> + else if (conversionType == CONVERT_SFIXED)
> + {
> + pGather = FMUL(SI_TO_FP(pGather, mSimdFP32Ty), VBROADCAST(C(1/65536.0f)));
> + }
>
> vVertexElements[currentVertexElement++] = pGather;
> // e.g. result of a single 8x32bit integer gather for 32bit components
> diff --git a/src/gallium/drivers/swr/swr_screen.cpp b/src/gallium/drivers/swr/swr_screen.cpp
> index b5c2cd3..7a46d09 100644
> --- a/src/gallium/drivers/swr/swr_screen.cpp
> +++ b/src/gallium/drivers/swr/swr_screen.cpp
> @@ -531,6 +531,15 @@ mesa_to_swr_format(enum pipe_format format)
> {PIPE_FORMAT_R8G8B8_SINT, R8G8B8_SINT},
> {PIPE_FORMAT_R8G8B8A8_SINT, R8G8B8A8_SINT},
>
> + /* These formats are valid for vertex data, but should not be used
> + * for render targets.
> + */
> +
> + {PIPE_FORMAT_R32_FIXED, R32_SFIXED},
> + {PIPE_FORMAT_R32G32_FIXED, R32G32_SFIXED},
> + {PIPE_FORMAT_R32G32B32_FIXED, R32G32B32_SFIXED},
> + {PIPE_FORMAT_R32G32B32A32_FIXED, R32G32B32A32_SFIXED},
> +
> /* These formats have entries in SWR but don't have Load/StoreTile
> * implementations. That means these aren't renderable, and thus having
> * a mapping entry here is detrimental.
> --
> 2.7.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list