[Mesa-dev] [PATCH 5/8] i965: Implement FS backend for ARB_sample_shading

Kenneth Graunke kenneth at whitecape.org
Wed Oct 16 00:28:39 CEST 2013


On 10/14/2013 10:12 AM, Anuj Phogat wrote:
> Implement the FS backend for new builtins added by the extension:
> in vec2 gl_SamplePosition
> in int gl_SampleID
> in int gl_NumSamples
> out int gl_SampleMask[]
> 
> Signed-off-by: Anuj Phogat <anuj.phogat at gmail.com>
> ---
>  src/mesa/drivers/dri/i965/brw_fs.cpp         | 109 +++++++++++++++++++++++++++
>  src/mesa/drivers/dri/i965/brw_fs.h           |   4 +
>  src/mesa/drivers/dri/i965/brw_fs_visitor.cpp |  23 ++++++
>  src/mesa/drivers/dri/i965/brw_wm.h           |   1 +
>  4 files changed, 137 insertions(+)
> 
> diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp
> index e5d6e4b..e4f7745 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp
> @@ -1115,6 +1115,109 @@ fs_visitor::emit_frontfacing_interpolation(ir_variable *ir)
>     return reg;
>  }
>  
> +void
> +fs_visitor::compute_sample_position(fs_reg dst, fs_reg int_sample_pos)
> +{
> +   int num_samples = ctx->DrawBuffer->Visual.samples;
> +   assert(num_samples >= 0 && num_samples <= 8);
> +
> +   /* From arb_sample_shading specification:
> +    * "When rendering to a non-multisample buffer, or if multisample
> +    *  rasterization is disabled, gl_SamplePosition will always be
> +    *  (0.5, 0.5).
> +    */
> +   if (!ctx->Multisample.Enabled || num_samples == 0) {
> +      emit(BRW_OPCODE_MOV, dst, fs_reg(0.5f));
> +   }
> +   else {
> +      /* For num_samples = {4, 8} */
> +      emit(BRW_OPCODE_MOV, dst, int_sample_pos);
> +      emit(BRW_OPCODE_MUL, dst, dst, fs_reg(1 / 16.0f));
> +   }
> +}

> +fs_reg *
> +fs_visitor::emit_sampleid_interpolation(ir_variable *ir)
> +{
> +   assert(brw->gen >= 6);
> +   bool multisampled_fbo = ctx->DrawBuffer->Visual.samples > 1;
> +
> +   this->current_annotation = "compute sample id";
> +   fs_reg *reg = new(this->mem_ctx) fs_reg(this, ir->type);
> +
> +   if (multisampled_fbo && ctx->Multisample.Enabled) {

One more thing.  These two blocks have different conditions.  For
gl_SamplePosition, num_samples == 1 hits the MSAA case.  For
gl_SampleId, num_samples == 1 hits the non-MSAA case.

I don't know which is right, but they should match.


More information about the mesa-dev mailing list