mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-09-12 18:50:22 -07:00
tests/shader_runner: Parse hex blobs as a list of 32-bit integers.
This commit is contained in:
Notes:
Henri Verbeet
2025-08-04 15:08:50 +02:00
Approved-by: Henri Verbeet (@hverbeet) Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1667
@@ -1726,9 +1726,8 @@ static HRESULT dxc_compiler_compile_shader(void *dxc_compiler, const char *profi
|
||||
|
||||
static ID3D10Blob *parse_hex(const char *source)
|
||||
{
|
||||
size_t len = strlen(source), i, pos = 0;
|
||||
unsigned char *ptr, value = 0;
|
||||
bool even = false;
|
||||
size_t len = strlen(source), i, pos = 0, nibble = 0;
|
||||
uint32_t *ptr, value = 0;
|
||||
ID3D10Blob *blob;
|
||||
|
||||
ptr = malloc(len / 2);
|
||||
@@ -1737,40 +1736,49 @@ static ID3D10Blob *parse_hex(const char *source)
|
||||
{
|
||||
char c = source[i];
|
||||
|
||||
if (nibble == 8)
|
||||
{
|
||||
ptr[pos++] = value;
|
||||
nibble = 0;
|
||||
value = 0;
|
||||
}
|
||||
|
||||
if (isspace(c))
|
||||
{
|
||||
if (nibble && nibble != 8)
|
||||
fatal_error("Malformed hex literal.\n");
|
||||
continue;
|
||||
}
|
||||
|
||||
if (c == '%')
|
||||
{
|
||||
if (nibble && nibble != 8)
|
||||
fatal_error("Malformed hex literal.\n");
|
||||
while (source[i] != '\n')
|
||||
++i;
|
||||
continue;
|
||||
}
|
||||
|
||||
value <<= 4;
|
||||
if ('0' <= c && c <= '9')
|
||||
value = 16 * value + (c - '0');
|
||||
value |= (c - '0');
|
||||
else if ('a' <= c && c <= 'f')
|
||||
value = 16 * value + (c - 'a' + 10);
|
||||
value |= (c - 'a' + 10);
|
||||
else if ('A' <= c && c <= 'F')
|
||||
value = 16 * value + (c - 'A' + 10);
|
||||
value |= (c - 'A' + 10);
|
||||
else
|
||||
fatal_error("Invalid hex character '%c'\n", c);
|
||||
|
||||
if (even)
|
||||
{
|
||||
ptr[pos++] = value;
|
||||
value = 0;
|
||||
}
|
||||
|
||||
even = !even;
|
||||
++nibble;
|
||||
}
|
||||
|
||||
if (even)
|
||||
fatal_error("Odd number of hex characters.\n");
|
||||
if (nibble == 8)
|
||||
ptr[pos++] = value;
|
||||
else if (nibble)
|
||||
fatal_error("Malformed hex literal.\n");
|
||||
|
||||
D3DCreateBlob(pos, &blob);
|
||||
D3DCreateBlob(pos * sizeof(value), &blob);
|
||||
if (pos)
|
||||
memcpy(ID3D10Blob_GetBufferPointer(blob), ptr, pos);
|
||||
memcpy(ID3D10Blob_GetBufferPointer(blob), ptr, pos * sizeof(value));
|
||||
free(ptr);
|
||||
|
||||
return blob;
|
||||
|
Reference in New Issue
Block a user