return BUILTIN_INVOCATION_ID;
else if(name=="gl_Layer")
return BUILTIN_LAYER;
+ else if(name=="gl_TessLevelOuter")
+ return BUILTIN_TESS_LEVEL_OUTER;
+ else if(name=="gl_TessLevelInner")
+ return BUILTIN_TESS_LEVEL_INNER;
+ else if(name=="gl_TessCoord")
+ return BUILTIN_TESS_COORD;
+ else if(name=="gl_PatchVerticesIn")
+ return BUILTIN_PATCH_VERTICES;
else if(name=="gl_FragCoord")
return BUILTIN_FRAG_COORD;
else if(name=="gl_PointCoord")
if(composite_access)
{
r_expression_result_id = 0;
- if(!assignment_source_id)
+ if(assignment_source_id)
+ variable_load_ids.erase(var.declaration);
+ else
{
auto i = variable_load_ids.find(var.declaration);
if(i!=variable_load_ids.end())
BuiltinSemantic semantic = get_builtin_semantic(var.name);
writer.write_op_decorate(var_id, DECO_BUILTIN, semantic);
}
+ if(var.sampling=="flat")
+ writer.write_op_decorate(var_id, DECO_FLAT);
+ if(var.sampling=="centroid")
+ writer.write_op_decorate(var_id, DECO_CENTROID);
+ if(var.sampling=="patch")
+ writer.write_op_decorate(var_id, DECO_PATCH);
if(init_id && current_function)
{
switch(stage->type)
{
case Stage::VERTEX: writer.write(0); break;
+ case Stage::TESS_CONTROL: writer.write(1); break;
+ case Stage::TESS_EVAL: writer.write(2); break;
case Stage::GEOMETRY: writer.write(3); break;
case Stage::FRAGMENT: writer.write(4); break;
case Stage::COMPUTE: writer.write(5); break;
use_capability(CAP_GEOMETRY);
writer.write_op(content.exec_modes, OP_EXECUTION_MODE, func_id, EXEC_INVOCATIONS, 1);
}
+ else if(stage->type==Stage::TESS_CONTROL || stage->type==Stage::TESS_EVAL)
+ {
+ use_capability(CAP_TESSELLATION);
+ }
unsigned local_size[3] = { 0, 1, 1 };
writer.write_op(content.exec_modes, OP_EXECUTION_MODE, func_id, EXEC_TRIANGLES);
else if(q.name=="triangles_adjacency")
writer.write_op(content.exec_modes, OP_EXECUTION_MODE, func_id, EXEC_INPUT_TRIANGLES_ADJACENCY);
+ else if(q.name=="quads")
+ writer.write_op(content.exec_modes, OP_EXECUTION_MODE, func_id, EXEC_QUADS);
+ else if(q.name=="isolines")
+ writer.write_op(content.exec_modes, OP_EXECUTION_MODE, func_id, EXEC_ISOLINES);
else if(q.name=="line_strip")
writer.write_op(content.exec_modes, OP_EXECUTION_MODE, func_id, EXEC_OUTPUT_LINE_STRIP);
else if(q.name=="triangle_strip")
writer.write_op(content.exec_modes, OP_EXECUTION_MODE, func_id, EXEC_OUTPUT_TRIANGLE_STRIP);
- else if(q.name=="max_vertices")
+ else if(q.name=="max_vertices" || q.name=="vertices")
writer.write_op(content.exec_modes, OP_EXECUTION_MODE, func_id, EXEC_OUTPUT_VERTICES, q.value);
+ else if(q.name=="cw")
+ writer.write_op(content.exec_modes, OP_EXECUTION_MODE, func_id, EXEC_VERTEX_ORDER_CW);
+ else if(q.name=="ccw")
+ writer.write_op(content.exec_modes, OP_EXECUTION_MODE, func_id, EXEC_VERTEX_ORDER_CCW);
+ else if(q.name=="equal_spacing")
+ writer.write_op(content.exec_modes, OP_EXECUTION_MODE, func_id, EXEC_SPACING_EQUAL);
+ else if(q.name=="fractional_even_spacing")
+ writer.write_op(content.exec_modes, OP_EXECUTION_MODE, func_id, EXEC_SPACING_FRACTIONAL_EVEN);
+ else if(q.name=="fractional_odd_spacing")
+ writer.write_op(content.exec_modes, OP_EXECUTION_MODE, func_id, EXEC_SPACING_FRACTIONAL_ODD);
else if(q.name=="local_size_x")
local_size[0] = q.value;
else if(q.name=="local_size_y")