mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-10 08:10:14 +01:00
glsl: Modify ir_end_primitive to have a stream.
This will be necessary to implement EndStreamPrimitive(). EndPrimitive() will produce an ir_end_primitive with the default stream 0. Reviewed-by: Chris Forbes <chrisf@ijw.co.nz>
This commit is contained in:
parent
8639effefe
commit
4b3fc21032
7 changed files with 64 additions and 16 deletions
|
|
@ -3883,7 +3883,8 @@ builtin_builder::_EndPrimitive()
|
|||
{
|
||||
MAKE_SIG(glsl_type::void_type, gs_only, 0);
|
||||
|
||||
body.emit(new(mem_ctx) ir_end_primitive());
|
||||
ir_rvalue *stream = new(mem_ctx) ir_constant(0, 1);
|
||||
body.emit(new(mem_ctx) ir_end_primitive(stream));
|
||||
|
||||
return sig;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2192,9 +2192,11 @@ public:
|
|||
*/
|
||||
class ir_end_primitive : public ir_instruction {
|
||||
public:
|
||||
ir_end_primitive()
|
||||
: ir_instruction(ir_type_end_primitive)
|
||||
ir_end_primitive(ir_rvalue *stream)
|
||||
: ir_instruction(ir_type_end_primitive),
|
||||
stream(stream)
|
||||
{
|
||||
assert(stream);
|
||||
}
|
||||
|
||||
virtual void accept(ir_visitor *v)
|
||||
|
|
@ -2202,12 +2204,19 @@ public:
|
|||
v->visit(this);
|
||||
}
|
||||
|
||||
virtual ir_end_primitive *clone(void *mem_ctx, struct hash_table *) const
|
||||
virtual ir_end_primitive *clone(void *mem_ctx, struct hash_table *ht) const
|
||||
{
|
||||
return new(mem_ctx) ir_end_primitive();
|
||||
return new(mem_ctx) ir_end_primitive(this->stream->clone(mem_ctx, ht));
|
||||
}
|
||||
|
||||
virtual ir_visitor_status accept(ir_hierarchical_visitor *);
|
||||
|
||||
int stream_id() const
|
||||
{
|
||||
return stream->as_constant()->value.i[0];
|
||||
}
|
||||
|
||||
ir_rvalue *stream;
|
||||
};
|
||||
|
||||
/*@}*/
|
||||
|
|
|
|||
|
|
@ -68,15 +68,6 @@ ir_hierarchical_visitor::visit(ir_loop_jump *ir)
|
|||
return visit_continue;
|
||||
}
|
||||
|
||||
ir_visitor_status
|
||||
ir_hierarchical_visitor::visit(ir_end_primitive *ir)
|
||||
{
|
||||
if (this->callback != NULL)
|
||||
this->callback(ir, this->data);
|
||||
|
||||
return visit_continue;
|
||||
}
|
||||
|
||||
ir_visitor_status
|
||||
ir_hierarchical_visitor::visit(ir_dereference_variable *ir)
|
||||
{
|
||||
|
|
@ -310,6 +301,22 @@ ir_hierarchical_visitor::visit_leave(ir_emit_vertex *ir)
|
|||
return visit_continue;
|
||||
}
|
||||
|
||||
ir_visitor_status
|
||||
ir_hierarchical_visitor::visit_enter(ir_end_primitive *ir)
|
||||
{
|
||||
if (this->callback != NULL)
|
||||
this->callback(ir, this->data);
|
||||
|
||||
return visit_continue;
|
||||
}
|
||||
|
||||
ir_visitor_status
|
||||
ir_hierarchical_visitor::visit_leave(ir_end_primitive *ir)
|
||||
{
|
||||
(void) ir;
|
||||
return visit_continue;
|
||||
}
|
||||
|
||||
void
|
||||
ir_hierarchical_visitor::run(exec_list *instructions)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -87,7 +87,6 @@ public:
|
|||
virtual ir_visitor_status visit(class ir_variable *);
|
||||
virtual ir_visitor_status visit(class ir_constant *);
|
||||
virtual ir_visitor_status visit(class ir_loop_jump *);
|
||||
virtual ir_visitor_status visit(class ir_end_primitive *);
|
||||
|
||||
/**
|
||||
* ir_dereference_variable isn't technically a leaf, but it is treated as a
|
||||
|
|
@ -138,6 +137,8 @@ public:
|
|||
virtual ir_visitor_status visit_leave(class ir_if *);
|
||||
virtual ir_visitor_status visit_enter(class ir_emit_vertex *);
|
||||
virtual ir_visitor_status visit_leave(class ir_emit_vertex *);
|
||||
virtual ir_visitor_status visit_enter(class ir_end_primitive *);
|
||||
virtual ir_visitor_status visit_leave(class ir_end_primitive *);
|
||||
/*@}*/
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -420,5 +420,13 @@ ir_emit_vertex::accept(ir_hierarchical_visitor *v)
|
|||
ir_visitor_status
|
||||
ir_end_primitive::accept(ir_hierarchical_visitor *v)
|
||||
{
|
||||
return v->visit(this);
|
||||
ir_visitor_status s = v->visit_enter(this);
|
||||
if (s != visit_continue)
|
||||
return (s == visit_continue_with_parent) ? visit_continue : s;
|
||||
|
||||
s = this->stream->accept(v);
|
||||
if (s != visit_continue)
|
||||
return (s == visit_continue_with_parent) ? visit_continue : s;
|
||||
|
||||
return (s == visit_stop) ? s : v->visit_leave(this);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -156,6 +156,13 @@ ir_rvalue_base_visitor::rvalue_visit(ir_emit_vertex *ir)
|
|||
return visit_continue;
|
||||
}
|
||||
|
||||
ir_visitor_status
|
||||
ir_rvalue_base_visitor::rvalue_visit(ir_end_primitive *ir)
|
||||
{
|
||||
handle_rvalue(&ir->stream);
|
||||
return visit_continue;
|
||||
}
|
||||
|
||||
ir_visitor_status
|
||||
ir_rvalue_visitor::visit_leave(ir_expression *ir)
|
||||
{
|
||||
|
|
@ -216,6 +223,12 @@ ir_rvalue_visitor::visit_leave(ir_emit_vertex *ir)
|
|||
return rvalue_visit(ir);
|
||||
}
|
||||
|
||||
ir_visitor_status
|
||||
ir_rvalue_visitor::visit_leave(ir_end_primitive *ir)
|
||||
{
|
||||
return rvalue_visit(ir);
|
||||
}
|
||||
|
||||
ir_visitor_status
|
||||
ir_rvalue_enter_visitor::visit_enter(ir_expression *ir)
|
||||
{
|
||||
|
|
@ -275,3 +288,9 @@ ir_rvalue_enter_visitor::visit_enter(ir_emit_vertex *ir)
|
|||
{
|
||||
return rvalue_visit(ir);
|
||||
}
|
||||
|
||||
ir_visitor_status
|
||||
ir_rvalue_enter_visitor::visit_enter(ir_end_primitive *ir)
|
||||
{
|
||||
return rvalue_visit(ir);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -42,6 +42,7 @@ public:
|
|||
ir_visitor_status rvalue_visit(ir_swizzle *);
|
||||
ir_visitor_status rvalue_visit(ir_texture *);
|
||||
ir_visitor_status rvalue_visit(ir_emit_vertex *);
|
||||
ir_visitor_status rvalue_visit(ir_end_primitive *);
|
||||
|
||||
virtual void handle_rvalue(ir_rvalue **rvalue) = 0;
|
||||
};
|
||||
|
|
@ -59,6 +60,7 @@ public:
|
|||
virtual ir_visitor_status visit_leave(ir_swizzle *);
|
||||
virtual ir_visitor_status visit_leave(ir_texture *);
|
||||
virtual ir_visitor_status visit_leave(ir_emit_vertex *);
|
||||
virtual ir_visitor_status visit_leave(ir_end_primitive *);
|
||||
};
|
||||
|
||||
class ir_rvalue_enter_visitor : public ir_rvalue_base_visitor {
|
||||
|
|
@ -74,4 +76,5 @@ public:
|
|||
virtual ir_visitor_status visit_enter(ir_swizzle *);
|
||||
virtual ir_visitor_status visit_enter(ir_texture *);
|
||||
virtual ir_visitor_status visit_enter(ir_emit_vertex *);
|
||||
virtual ir_visitor_status visit_enter(ir_end_primitive *);
|
||||
};
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue