You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
168 lines
5.8 KiB
C
168 lines
5.8 KiB
C
// Modifications copyright Amazon.com, Inc. or its affiliates
|
|
#include "internal_includes/hlslccToolkit.h"
|
|
#include "internal_includes/debug.h"
|
|
#include "internal_includes/languages.h"
|
|
|
|
bool DoAssignmentDataTypesMatch(SHADER_VARIABLE_TYPE dest, SHADER_VARIABLE_TYPE src)
|
|
{
|
|
if (src == dest)
|
|
return true;
|
|
|
|
if ((dest == SVT_FLOAT || dest == SVT_FLOAT10 || dest == SVT_FLOAT16) &&
|
|
(src == SVT_FLOAT || src == SVT_FLOAT10 || src == SVT_FLOAT16))
|
|
return true;
|
|
|
|
if ((dest == SVT_INT || dest == SVT_INT12 || dest == SVT_INT16) &&
|
|
(src == SVT_INT || src == SVT_INT12 || src == SVT_INT16))
|
|
return true;
|
|
|
|
if ((dest == SVT_UINT || dest == SVT_UINT16) &&
|
|
(src == SVT_UINT || src == SVT_UINT16))
|
|
return true;
|
|
|
|
return false;
|
|
}
|
|
|
|
const char * GetConstructorForTypeGLSL(HLSLCrossCompilerContext* psContext, const SHADER_VARIABLE_TYPE eType, const int components, bool useGLSLPrecision)
|
|
{
|
|
const bool usePrecision = useGLSLPrecision && HavePrecisionQualifers(psContext->psShader->eTargetLanguage);
|
|
|
|
static const char * const uintTypes[] = { " ", "uint", "uvec2", "uvec3", "uvec4" };
|
|
static const char * const uint16Types[] = { " ", "mediump uint", "mediump uvec2", "mediump uvec3", "mediump uvec4" };
|
|
static const char * const intTypes[] = { " ", "int", "ivec2", "ivec3", "ivec4" };
|
|
static const char * const int16Types[] = { " ", "mediump int", "mediump ivec2", "mediump ivec3", "mediump ivec4" };
|
|
static const char * const int12Types[] = { " ", "lowp int", "lowp ivec2", "lowp ivec3", "lowp ivec4" };
|
|
static const char * const floatTypes[] = { " ", "float", "vec2", "vec3", "vec4" };
|
|
static const char * const float16Types[] = { " ", "mediump float", "mediump vec2", "mediump vec3", "mediump vec4" };
|
|
static const char * const float10Types[] = { " ", "lowp float", "lowp vec2", "lowp vec3", "lowp vec4" };
|
|
static const char * const boolTypes[] = { " ", "bool", "bvec2", "bvec3", "bvec4" };
|
|
|
|
ASSERT(components >= 1 && components <= 4);
|
|
|
|
switch (eType)
|
|
{
|
|
case SVT_UINT:
|
|
return uintTypes[components];
|
|
case SVT_UINT16:
|
|
return usePrecision ? uint16Types[components] : uintTypes[components];
|
|
case SVT_INT:
|
|
return intTypes[components];
|
|
case SVT_INT16:
|
|
return usePrecision ? int16Types[components] : intTypes[components];
|
|
case SVT_INT12:
|
|
return usePrecision ? int12Types[components] : intTypes[components];
|
|
case SVT_FLOAT:
|
|
return floatTypes[components];
|
|
case SVT_FLOAT16:
|
|
return usePrecision ? float16Types[components] : floatTypes[components];
|
|
case SVT_FLOAT10:
|
|
return usePrecision ? float10Types[components] : floatTypes[components];
|
|
case SVT_BOOL:
|
|
return boolTypes[components];
|
|
default:
|
|
ASSERT(0);
|
|
return "";
|
|
}
|
|
}
|
|
|
|
SHADER_VARIABLE_TYPE TypeFlagsToSVTType(const uint32_t typeflags)
|
|
{
|
|
if (typeflags & TO_FLAG_INTEGER)
|
|
return SVT_INT;
|
|
if (typeflags & TO_FLAG_UNSIGNED_INTEGER)
|
|
return SVT_UINT;
|
|
return SVT_FLOAT;
|
|
}
|
|
|
|
uint32_t SVTTypeToFlag(const SHADER_VARIABLE_TYPE eType)
|
|
{
|
|
if (eType == SVT_FLOAT16 || eType == SVT_FLOAT10 || eType == SVT_FLOAT)
|
|
{
|
|
return TO_FLAG_FLOAT;
|
|
}
|
|
if (eType == SVT_UINT || eType == SVT_UINT16)
|
|
{
|
|
return TO_FLAG_UNSIGNED_INTEGER;
|
|
}
|
|
else if (eType == SVT_INT || eType == SVT_INT16 || eType == SVT_INT12)
|
|
{
|
|
return TO_FLAG_INTEGER;
|
|
}
|
|
else
|
|
{
|
|
return TO_FLAG_NONE;
|
|
}
|
|
}
|
|
|
|
bool CanDoDirectCast(SHADER_VARIABLE_TYPE src, SHADER_VARIABLE_TYPE dest)
|
|
{
|
|
// uint<->int<->bool conversions possible
|
|
if ((src == SVT_INT || src == SVT_UINT || src == SVT_BOOL || src == SVT_INT12 || src == SVT_INT16 || src == SVT_UINT16) &&
|
|
(dest == SVT_INT || dest == SVT_UINT || dest == SVT_BOOL || dest == SVT_INT12 || dest == SVT_INT16 || dest == SVT_UINT16))
|
|
return true;
|
|
|
|
// float<->double possible
|
|
if ((src == SVT_FLOAT || src == SVT_DOUBLE || src == SVT_FLOAT16 || src == SVT_FLOAT10) &&
|
|
(dest == SVT_FLOAT || dest == SVT_DOUBLE || dest == SVT_FLOAT16 || dest == SVT_FLOAT10))
|
|
return true;
|
|
|
|
return false;
|
|
}
|
|
|
|
const char* GetBitcastOp(SHADER_VARIABLE_TYPE from, SHADER_VARIABLE_TYPE to)
|
|
{
|
|
static const char* intToFloat = "intBitsToFloat";
|
|
static const char* uintToFloat = "uintBitsToFloat";
|
|
static const char* floatToInt = "floatBitsToInt";
|
|
static const char* floatToUint = "floatBitsToUint";
|
|
|
|
if ((to == SVT_FLOAT || to == SVT_FLOAT16 || to == SVT_FLOAT10) && from == SVT_INT)
|
|
return intToFloat;
|
|
else if ((to == SVT_FLOAT || to == SVT_FLOAT16 || to == SVT_FLOAT10) && from == SVT_UINT)
|
|
return uintToFloat;
|
|
else if (to == SVT_INT && (from == SVT_FLOAT || from == SVT_FLOAT16 || from == SVT_FLOAT10))
|
|
return floatToInt;
|
|
else if (to == SVT_UINT && (from == SVT_FLOAT || from == SVT_FLOAT16 || from == SVT_FLOAT10))
|
|
return floatToUint;
|
|
|
|
ASSERT(0);
|
|
return "";
|
|
}
|
|
|
|
bool IsGmemReservedSlot(FRAMEBUFFER_FETCH_TYPE typeMask, const uint32_t regNumber)
|
|
{
|
|
if (((typeMask & FBF_ARM_COLOR) && regNumber == GMEM_ARM_COLOR_SLOT) ||
|
|
((typeMask & FBF_ARM_DEPTH) && regNumber == GMEM_ARM_DEPTH_SLOT) ||
|
|
((typeMask & FBF_ARM_STENCIL) && regNumber == GMEM_ARM_STENCIL_SLOT) ||
|
|
((typeMask & FBF_EXT_COLOR) && regNumber >= GMEM_FLOAT_START_SLOT))
|
|
{
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
const char * GetAuxArgumentName(const SHADER_VARIABLE_TYPE varType)
|
|
{
|
|
switch (varType)
|
|
{
|
|
case SVT_UINT:
|
|
case SVT_UINT8:
|
|
case SVT_UINT16:
|
|
return "uArg";
|
|
case SVT_INT:
|
|
case SVT_INT16:
|
|
case SVT_INT12:
|
|
return "iArg";
|
|
case SVT_FLOAT:
|
|
case SVT_FLOAT16:
|
|
case SVT_FLOAT10:
|
|
return "fArg";
|
|
case SVT_BOOL:
|
|
return "bArg";
|
|
default:
|
|
ASSERT(0);
|
|
return "";
|
|
}
|
|
}
|