nir/spirv: improve parsing of the memory model

v2: add some vtn_fail_ifs

Signed-off-by: Karol Herbst <kherbst@redhat.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
This commit is contained in:
Karol Herbst
2018-07-19 13:04:14 +02:00
parent 5d48359a2c
commit 5f8257fb0b
3 changed files with 45 additions and 7 deletions

View File

@@ -243,6 +243,15 @@ typedef struct shader_info {
* Size of shared variables accessed by the compute shader.
*/
unsigned shared_size;
/**
* pointer size is:
* AddressingModelLogical: 0 (default)
* AddressingModelPhysical32: 32
* AddressingModelPhysical64: 64
*/
unsigned ptr_size;
} cs;
/* Applies to both TCS and TES. */

View File

@@ -3732,12 +3732,38 @@ vtn_handle_preamble_instruction(struct vtn_builder *b, SpvOp opcode,
break;
case SpvOpMemoryModel:
vtn_assert(w[1] == SpvAddressingModelLogical ||
(b->options &&
b->options->caps.physical_storage_buffer_address &&
w[1] == SpvAddressingModelPhysicalStorageBuffer64EXT));
switch (w[1]) {
case SpvAddressingModelPhysical32:
vtn_fail_if(b->shader->info.stage != MESA_SHADER_KERNEL,
"AddressingModelPhysical32 only supported for kernels");
b->shader->info.cs.ptr_size = 32;
b->physical_ptrs = true;
break;
case SpvAddressingModelPhysical64:
vtn_fail_if(b->shader->info.stage != MESA_SHADER_KERNEL,
"AddressingModelPhysical64 only supported for kernels");
b->shader->info.cs.ptr_size = 64;
b->physical_ptrs = true;
break;
case SpvAddressingModelLogical:
vtn_fail_if(b->shader->info.stage >= MESA_SHADER_STAGES,
"AddressingModelLogical only supported for shaders");
b->shader->info.cs.ptr_size = 0;
b->physical_ptrs = false;
break;
case SpvAddressingModelPhysicalStorageBuffer64EXT:
vtn_fail_if(!b->options ||
!b->options->caps.physical_storage_buffer_address,
"AddressingModelPhysicalStorageBuffer64EXT not supported");
break;
default:
vtn_fail("Unknown addressing model");
break;
}
vtn_assert(w[2] == SpvMemoryModelSimple ||
w[2] == SpvMemoryModelGLSL450);
w[2] == SpvMemoryModelGLSL450 ||
w[2] == SpvMemoryModelOpenCL);
break;
case SpvOpEntryPoint:
@@ -4440,6 +4466,8 @@ spirv_to_nir(const uint32_t *words, size_t word_count,
/* Skip the SPIR-V header, handled at vtn_create_builder */
words+= 5;
b->shader = nir_shader_create(b, stage, nir_options, NULL);
/* Handle all the preamble instructions */
words = vtn_foreach_instruction(b, words, word_end,
vtn_handle_preamble_instruction);
@@ -4450,8 +4478,6 @@ spirv_to_nir(const uint32_t *words, size_t word_count,
return NULL;
}
b->shader = nir_shader_create(b, stage, nir_options, NULL);
/* Set shader info defaults */
b->shader->info.gs.invocations = 1;

View File

@@ -613,6 +613,9 @@ struct vtn_builder {
/* false by default, set to true by the ContractionOff execution mode */
bool exact;
/* when a physical memory model is choosen */
bool physical_ptrs;
};
nir_ssa_def *