i965/vs: Move compute_clip_distance() out of emit_urb_writes().
Legacy user clipping (using gl_Position or gl_ClipVertex) is handled by turning those into the modern gl_ClipDistance equivalents. This is unnecessary in Core Profile: if user clipping is enabled, but the shader doesn't write the corresponding gl_ClipDistance entry, results are undefined. Hence, it is also unnecessary for geometry shaders. This patch moves the call up to run_vs(). This is equivalent for VS, but removes the need to pass clip distances into emit_urb_writes(). Signed-off-by: Kenneth Graunke <kenneth@whitecape.org> Reviewed-by: Jason Ekstrand <jason.ekstrand@intel.com> Reviewed-by: Chris Forbes <chrisf@ijw.co.nz>
This commit is contained in:
@@ -3816,7 +3816,9 @@ fs_visitor::run_vs(gl_clip_plane *clip_planes)
|
||||
if (failed)
|
||||
return false;
|
||||
|
||||
emit_urb_writes(clip_planes);
|
||||
compute_clip_distance(clip_planes);
|
||||
|
||||
emit_urb_writes();
|
||||
|
||||
if (shader_time_index >= 0)
|
||||
emit_shader_time_end();
|
||||
|
||||
@@ -271,7 +271,7 @@ public:
|
||||
fs_reg src0_alpha, unsigned components,
|
||||
unsigned exec_size, bool use_2nd_half = false);
|
||||
void emit_fb_writes();
|
||||
void emit_urb_writes(gl_clip_plane *clip_planes);
|
||||
void emit_urb_writes();
|
||||
void emit_cs_terminate();
|
||||
|
||||
void emit_barrier();
|
||||
|
||||
@@ -1731,6 +1731,12 @@ fs_visitor::setup_uniform_clipplane_values(gl_clip_plane *clip_planes)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Lower legacy fixed-function and gl_ClipVertex clipping to clip distances.
|
||||
*
|
||||
* This does nothing if the shader uses gl_ClipDistance or user clipping is
|
||||
* disabled altogether.
|
||||
*/
|
||||
void fs_visitor::compute_clip_distance(gl_clip_plane *clip_planes)
|
||||
{
|
||||
struct brw_vue_prog_data *vue_prog_data =
|
||||
@@ -1738,6 +1744,10 @@ void fs_visitor::compute_clip_distance(gl_clip_plane *clip_planes)
|
||||
const struct brw_vue_prog_key *key =
|
||||
(const struct brw_vue_prog_key *) this->key;
|
||||
|
||||
/* Bail unless some sort of legacy clipping is enabled */
|
||||
if (!key->userclip_active || prog->UsesClipDistanceOut)
|
||||
return;
|
||||
|
||||
/* From the GLSL 1.30 spec, section 7.1 (Vertex Shader Special Variables):
|
||||
*
|
||||
* "If a linked set of shaders forming the vertex stage contains no
|
||||
@@ -1781,7 +1791,7 @@ void fs_visitor::compute_clip_distance(gl_clip_plane *clip_planes)
|
||||
}
|
||||
|
||||
void
|
||||
fs_visitor::emit_urb_writes(gl_clip_plane *clip_planes)
|
||||
fs_visitor::emit_urb_writes()
|
||||
{
|
||||
int slot, urb_offset, length;
|
||||
struct brw_vs_prog_data *vs_prog_data =
|
||||
@@ -1794,10 +1804,6 @@ fs_visitor::emit_urb_writes(gl_clip_plane *clip_planes)
|
||||
bool flush;
|
||||
fs_reg sources[8];
|
||||
|
||||
/* Lower legacy ff and ClipVertex clipping to clip distances */
|
||||
if (key->base.userclip_active && !prog->UsesClipDistanceOut)
|
||||
compute_clip_distance(clip_planes);
|
||||
|
||||
/* If we don't have any valid slots to write, just do a minimal urb write
|
||||
* send to terminate the shader. This includes 1 slot of undefined data,
|
||||
* because it's invalid to write 0 data:
|
||||
|
||||
Reference in New Issue
Block a user