| 3136 | } |
| 3137 | |
| 3138 | static void FillShaderVarData(ShaderVariable &var, const ShaderConstant &elem, const byte *data, |
| 3139 | const byte *end) |
| 3140 | { |
| 3141 | int src = 0; |
| 3142 | |
| 3143 | uint32_t outerCount = elem.type.rows; |
| 3144 | uint32_t innerCount = elem.type.columns; |
| 3145 | |
| 3146 | bool colMajor = false; |
| 3147 | |
| 3148 | if(elem.type.ColMajor() && outerCount > 1) |
| 3149 | { |
| 3150 | colMajor = true; |
| 3151 | std::swap(outerCount, innerCount); |
| 3152 | } |
| 3153 | |
| 3154 | QVariantList objs = GetVariants(GetInterpretedResourceFormat(elem), elem, data, end); |
| 3155 | |
| 3156 | if(objs.isEmpty()) |
| 3157 | { |
| 3158 | var.name = elem.name; |
| 3159 | var.value = ShaderValue(); |
| 3160 | var.flags |= ShaderVariableFlags::Truncated; |
| 3161 | return; |
| 3162 | } |
| 3163 | |
| 3164 | for(uint32_t outer = 0; outer < outerCount; outer++) |
| 3165 | { |
| 3166 | for(uint32_t inner = 0; inner < innerCount; inner++) |
| 3167 | { |
| 3168 | uint32_t dst = outer * innerCount + inner; |
| 3169 | |
| 3170 | QVariant o = objs[src]; |
| 3171 | |
| 3172 | src++; |
| 3173 | |
| 3174 | switch(var.type) |
| 3175 | { |
| 3176 | case VarType::Float: var.value.f32v[dst] = o.toFloat(); break; |
| 3177 | case VarType::Double: var.value.f64v[dst] = o.toDouble(); break; |
| 3178 | case VarType::Half: var.value.f16v[dst] = rdhalf::make(o.toFloat()); break; |
| 3179 | case VarType::Bool: var.value.u32v[dst] = o.toBool() ? 1 : 0; break; |
| 3180 | case VarType::ULong: var.value.u64v[dst] = o.toULongLong(); break; |
| 3181 | case VarType::UInt: var.value.u32v[dst] = o.toUInt(); break; |
| 3182 | case VarType::UShort: var.value.u16v[dst] = o.toUInt() & 0xffff; break; |
| 3183 | case VarType::UByte: var.value.u8v[dst] = o.toUInt() & 0xff; break; |
| 3184 | case VarType::SLong: var.value.s64v[dst] = o.toLongLong(); break; |
| 3185 | case VarType::SInt: var.value.s32v[dst] = o.toInt(); break; |
| 3186 | case VarType::SShort: |
| 3187 | var.value.u16v[dst] = (int16_t)qBound((int)INT16_MIN, o.toInt(), (int)INT16_MAX); |
| 3188 | break; |
| 3189 | case VarType::SByte: |
| 3190 | var.value.u8v[dst] = (int8_t)qBound((int)INT8_MIN, o.toInt(), (int)INT8_MAX); |
| 3191 | break; |
| 3192 | case VarType::Enum: var.value.u64v[dst] = o.value<EnumInterpValue>().val; break; |
| 3193 | case VarType::GPUPointer: |
| 3194 | var.SetTypedPointer(o.toULongLong(), ResourceId(), elem.type.pointerTypeID); |
| 3195 | break; |
no test coverage detected