On 01/04/2013 01:52 PM, Paul Berry wrote:
On 29 December 2012 04:35, Chris Forbes <chr...@ijw.co.nz
<mailto:chr...@ijw.co.nz>> wrote:

    When fetching texels from a multisample surface, the sample index is
    provided as an extra argument after the lod, and the actual lod needs
    to be hardwired to 0.

    The frontend gives us the sample index in the lod parameter, so fix this
    up.

How much work would it be to modify the front end so that instead of
giving us the sample index in the lod parameter, we add a "sample_index"
element to the ir_texture::lod_info union?  It seems like that would
make this code easier to follow.

I was thinking the same thing.

    Signed-off-by: Chris Forbes <chr...@ijw.co.nz <mailto:chr...@ijw.co.nz>>
    ---
      src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp | 15 +++++++++++++--
      1 file changed, 13 insertions(+), 2 deletions(-)

    diff --git a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
    b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
    index 104057c..8aa4b2d 100644
    --- a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
    +++ b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
    @@ -2088,8 +2088,19 @@ vec4_visitor::visit(ir_texture *ir)
              }
              emit(MOV(dst_reg(MRF, mrf, ir->lod_info.lod->type,
    writemask), lod));
            } else if (ir->op == ir_txf) {
    -        emit(MOV(dst_reg(MRF, param_base, ir->lod_info.lod->type,
    WRITEMASK_W),
    -                 lod));
    +         if (ir->sampler->type->sampler_dimensionality ==
    GLSL_SAMPLER_DIM_MS) {
    +            /* for multisample samplers, actual lod is always 0,
    and the
    +             * extra parameter is the sample index */
    +            emit(MOV(dst_reg(MRF, param_base,
    ir->lod_info.lod->type, WRITEMASK_W),
    +                     src_reg(0)));
    +            emit(MOV(dst_reg(MRF, param_base + 1,
    ir->lod_info.lod->type, WRITEMASK_X),
    +                     lod));   /* sample_index */
    +            inst->mlen++;     /* spilled over into a second reg of
    args */
    +         }
    +         else {
    +            emit(MOV(dst_reg(MRF, param_base,
    ir->lod_info.lod->type, WRITEMASK_W),
    +                     lod));
    +         }
            } else if (ir->op == ir_txd) {
              const glsl_type *type = ir->lod_info.grad.dPdx->type;

    --
    1.8.0.3

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to