SPV: Generate the LocalSize Execution Mode for compute shaders.

This commit is contained in:
John Kessenich 2015-09-16 16:04:05 -06:00
parent 56bab0483a
commit b56a26ab4d
6 changed files with 15 additions and 5 deletions

View File

@ -493,6 +493,9 @@ TGlslangToSpvTraverser::TGlslangToSpvTraverser(const glslang::TIntermediate* gls
case EShLangCompute: case EShLangCompute:
builder.addCapability(spv::CapabilityShader); builder.addCapability(spv::CapabilityShader);
builder.addExecutionMode(shaderEntry, spv::ExecutionModeLocalSize, glslangIntermediate->getLocalSize(0),
glslangIntermediate->getLocalSize(1),
glslangIntermediate->getLocalSize(2));
break; break;
default: default:

View File

@ -648,14 +648,18 @@ void Builder::addEntryPoint(ExecutionModel model, Function* function, const char
entryPoints.push_back(entryPoint); entryPoints.push_back(entryPoint);
} }
void Builder::addExecutionMode(Function* entryPoint, ExecutionMode mode, int value) // Currently relying on the fact that all 'value' of interest are small non-negative values.
void Builder::addExecutionMode(Function* entryPoint, ExecutionMode mode, int value1, int value2, int value3)
{ {
// TODO: handle multiple optional arguments
Instruction* instr = new Instruction(OpExecutionMode); Instruction* instr = new Instruction(OpExecutionMode);
instr->addIdOperand(entryPoint->getId()); instr->addIdOperand(entryPoint->getId());
instr->addImmediateOperand(mode); instr->addImmediateOperand(mode);
if (value >= 0) if (value1 >= 0)
instr->addImmediateOperand(value); instr->addImmediateOperand(value1);
if (value2 >= 0)
instr->addImmediateOperand(value2);
if (value3 >= 0)
instr->addImmediateOperand(value3);
executionModes.push_back(instr); executionModes.push_back(instr);
} }

View File

@ -182,7 +182,7 @@ public:
// Methods for adding information outside the CFG. // Methods for adding information outside the CFG.
void addEntryPoint(ExecutionModel, Function*, const char* name); void addEntryPoint(ExecutionModel, Function*, const char* name);
void addExecutionMode(Function*, ExecutionMode mode, int value = -1); void addExecutionMode(Function*, ExecutionMode mode, int value1 = -1, int value2 = -1, int value3 = -1);
void addName(Id, const char* name); void addName(Id, const char* name);
void addMemberName(Id, int member, const char* name); void addMemberName(Id, int member, const char* name);
void addLine(Id target, Id fileName, int line, int column); void addLine(Id target, Id fileName, int line, int column);

View File

@ -14,6 +14,7 @@ Linked compute stage:
1: ExtInstImport "GLSL.std.450" 1: ExtInstImport "GLSL.std.450"
MemoryModel Logical GLSL450 MemoryModel Logical GLSL450
EntryPoint GLCompute 4 "main" EntryPoint GLCompute 4 "main"
ExecutionMode 4 LocalSize 16 32 4
Name 4 "main" Name 4 "main"
Name 13 "outb" Name 13 "outb"
MemberName 13(outb) 0 "f" MemberName 13(outb) 0 "f"

View File

@ -15,6 +15,7 @@ TBD functionality: Is atomic_uint an opaque handle in the uniform storage class,
1: ExtInstImport "GLSL.std.450" 1: ExtInstImport "GLSL.std.450"
MemoryModel Logical GLSL450 MemoryModel Logical GLSL450
EntryPoint GLCompute 4 "main" EntryPoint GLCompute 4 "main"
ExecutionMode 4 LocalSize 1 1 1
Name 4 "main" Name 4 "main"
Name 10 "func(au1;" Name 10 "func(au1;"
Name 9 "c" Name 9 "c"

View File

@ -14,6 +14,7 @@ Linked compute stage:
1: ExtInstImport "GLSL.std.450" 1: ExtInstImport "GLSL.std.450"
MemoryModel Logical GLSL450 MemoryModel Logical GLSL450
EntryPoint GLCompute 4 "main" EntryPoint GLCompute 4 "main"
ExecutionMode 4 LocalSize 1 1 1
Name 4 "main" Name 4 "main"
Name 8 "bufName" Name 8 "bufName"
MemberName 8(bufName) 0 "f" MemberName 8(bufName) 0 "f"