aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKristian Høgsberg Kristensen <[email protected]>2016-05-12 17:38:56 -0700
committerKristian Høgsberg Kristensen <[email protected]>2016-05-13 16:28:25 -0700
commitc564348a2ec601b28ae607ca0f77054ea53f6912 (patch)
tree44312abbc8162862bebb751b3cd323b881b50b39
parenta1c244479247a736961f637b415e07d327203250 (diff)
i965: Add support for GL_ARB_cull_distance
Signed-off-by: Kristian Høgsberg Kristensen <[email protected]> Reviewed-by: Kenneth Graunke <[email protected]>
-rw-r--r--src/mesa/drivers/dri/i965/brw_compiler.h2
-rw-r--r--src/mesa/drivers/dri/i965/brw_gs.c4
-rw-r--r--src/mesa/drivers/dri/i965/brw_tes.c4
-rw-r--r--src/mesa/drivers/dri/i965/brw_vs.c4
-rw-r--r--src/mesa/drivers/dri/i965/gen6_clip_state.c2
-rw-r--r--src/mesa/drivers/dri/i965/gen8_ds_state.c3
-rw-r--r--src/mesa/drivers/dri/i965/gen8_gs_state.c3
-rw-r--r--src/mesa/drivers/dri/i965/gen8_vs_state.c3
-rw-r--r--src/mesa/drivers/dri/i965/intel_extensions.c1
9 files changed, 23 insertions, 3 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_compiler.h b/src/mesa/drivers/dri/i965/brw_compiler.h
index 580730589c3..3d1dc88eebc 100644
--- a/src/mesa/drivers/dri/i965/brw_compiler.h
+++ b/src/mesa/drivers/dri/i965/brw_compiler.h
@@ -592,6 +592,8 @@ struct brw_vue_prog_data {
GLuint urb_read_length;
GLuint total_grf;
+ uint32_t cull_distance_mask;
+
/* Used for calculating urb partitions. In the VS, this is the size of the
* URB entry used for both input and output to the thread. In the GS, this
* is the size of the URB entry used for output.
diff --git a/src/mesa/drivers/dri/i965/brw_gs.c b/src/mesa/drivers/dri/i965/brw_gs.c
index c888ef2bd67..91efd344f90 100644
--- a/src/mesa/drivers/dri/i965/brw_gs.c
+++ b/src/mesa/drivers/dri/i965/brw_gs.c
@@ -138,6 +138,10 @@ brw_codegen_gs_prog(struct brw_context *brw,
GLbitfield64 outputs_written = gp->program.Base.OutputsWritten;
+ prog_data.base.cull_distance_mask =
+ ((1 << gp->program.Base.CullDistanceArraySize) - 1) <<
+ gp->program.Base.ClipDistanceArraySize;
+
brw_compute_vue_map(brw->intelScreen->devinfo,
&prog_data.base.vue_map, outputs_written,
prog ? prog->SeparateShader : false);
diff --git a/src/mesa/drivers/dri/i965/brw_tes.c b/src/mesa/drivers/dri/i965/brw_tes.c
index 27dc7e59f5d..b7f1677caec 100644
--- a/src/mesa/drivers/dri/i965/brw_tes.c
+++ b/src/mesa/drivers/dri/i965/brw_tes.c
@@ -164,6 +164,10 @@ brw_codegen_tes_prog(struct brw_context *brw,
prog_data.base.base.nr_params = param_count;
prog_data.base.base.nr_image_params = tes->NumImages;
+ prog_data.base.cull_distance_mask =
+ ((1 << tep->program.Base.CullDistanceArraySize) - 1) <<
+ tep->program.Base.ClipDistanceArraySize;
+
brw_nir_setup_glsl_uniforms(nir, shader_prog, &tep->program.Base,
&prog_data.base.base,
compiler->scalar_stage[MESA_SHADER_TESS_EVAL]);
diff --git a/src/mesa/drivers/dri/i965/brw_vs.c b/src/mesa/drivers/dri/i965/brw_vs.c
index 3095d82d91e..1bbc315e9da 100644
--- a/src/mesa/drivers/dri/i965/brw_vs.c
+++ b/src/mesa/drivers/dri/i965/brw_vs.c
@@ -118,6 +118,10 @@ brw_codegen_vs_prog(struct brw_context *brw,
prog_data.inputs_read |= VERT_BIT_EDGEFLAG;
}
+ prog_data.base.cull_distance_mask =
+ ((1 << vp->program.Base.CullDistanceArraySize) - 1) <<
+ vp->program.Base.ClipDistanceArraySize;
+
if (brw->gen < 6) {
/* Put dummy slots into the VUE for the SF to put the replaced
* point sprite coords in. We shouldn't need these dummy slots,
diff --git a/src/mesa/drivers/dri/i965/gen6_clip_state.c b/src/mesa/drivers/dri/i965/gen6_clip_state.c
index 8ae19c8d370..26de633bae6 100644
--- a/src/mesa/drivers/dri/i965/gen6_clip_state.c
+++ b/src/mesa/drivers/dri/i965/gen6_clip_state.c
@@ -50,6 +50,8 @@ upload_clip_state(struct brw_context *brw)
dw2 |= GEN6_CLIP_NON_PERSPECTIVE_BARYCENTRIC_ENABLE;
}
+ dw1 |= brw->vs.prog_data->base.cull_distance_mask;
+
if (brw->gen >= 7)
dw1 |= GEN7_CLIP_EARLY_CULL;
diff --git a/src/mesa/drivers/dri/i965/gen8_ds_state.c b/src/mesa/drivers/dri/i965/gen8_ds_state.c
index c73016897b1..95582ac4448 100644
--- a/src/mesa/drivers/dri/i965/gen8_ds_state.c
+++ b/src/mesa/drivers/dri/i965/gen8_ds_state.c
@@ -69,7 +69,8 @@ gen8_upload_ds_state(struct brw_context *brw)
GEN7_DS_SIMD8_DISPATCH_ENABLE : 0) |
(tes_prog_data->domain == BRW_TESS_DOMAIN_TRI ?
GEN7_DS_COMPUTE_W_COORDINATE_ENABLE : 0));
- OUT_BATCH(SET_FIELD(ctx->Transform.ClipPlanesEnabled,
+ OUT_BATCH(SET_FIELD(vue_prog_data->cull_distance_mask |
+ ctx->Transform.ClipPlanesEnabled,
GEN8_DS_USER_CLIP_DISTANCE));
if (brw->gen >= 9) {
diff --git a/src/mesa/drivers/dri/i965/gen8_gs_state.c b/src/mesa/drivers/dri/i965/gen8_gs_state.c
index 0889311ad5c..2741330106d 100644
--- a/src/mesa/drivers/dri/i965/gen8_gs_state.c
+++ b/src/mesa/drivers/dri/i965/gen8_gs_state.c
@@ -108,7 +108,8 @@ gen8_upload_gs_state(struct brw_context *brw)
OUT_BATCH(dw8);
/* DW9 / _NEW_TRANSFORM */
- OUT_BATCH((ctx->Transform.ClipPlanesEnabled <<
+ OUT_BATCH((prog_data->cull_distance_mask |
+ ctx->Transform.ClipPlanesEnabled <<
GEN8_GS_USER_CLIP_DISTANCE_SHIFT) |
(urb_entry_output_length << GEN8_GS_URB_OUTPUT_LENGTH_SHIFT) |
(urb_entry_write_offset <<
diff --git a/src/mesa/drivers/dri/i965/gen8_vs_state.c b/src/mesa/drivers/dri/i965/gen8_vs_state.c
index fd59a86b77f..d4a345583d6 100644
--- a/src/mesa/drivers/dri/i965/gen8_vs_state.c
+++ b/src/mesa/drivers/dri/i965/gen8_vs_state.c
@@ -77,7 +77,8 @@ upload_vs_state(struct brw_context *brw)
GEN6_VS_ENABLE);
/* _NEW_TRANSFORM */
- OUT_BATCH((ctx->Transform.ClipPlanesEnabled <<
+ OUT_BATCH(prog_data->cull_distance_mask |
+ (ctx->Transform.ClipPlanesEnabled <<
GEN8_VS_USER_CLIP_DISTANCE_SHIFT));
ADVANCE_BATCH();
}
diff --git a/src/mesa/drivers/dri/i965/intel_extensions.c b/src/mesa/drivers/dri/i965/intel_extensions.c
index 8d98788a838..f8faaa36b0b 100644
--- a/src/mesa/drivers/dri/i965/intel_extensions.c
+++ b/src/mesa/drivers/dri/i965/intel_extensions.c
@@ -289,6 +289,7 @@ intelInitExtensions(struct gl_context *ctx)
ctx->Extensions.ARB_blend_func_extended =
!driQueryOptionb(&brw->optionCache, "disable_blend_func_extended");
ctx->Extensions.ARB_conditional_render_inverted = true;
+ ctx->Extensions.ARB_cull_distance = true;
ctx->Extensions.ARB_draw_buffers_blend = true;
ctx->Extensions.ARB_ES3_compatibility = true;
ctx->Extensions.ARB_fragment_layer_viewport = true;