[Mesa-dev] [PATCH 8/9] tgsi: Add code for handling lodq opcode
Krzesimir Nowak
krzesimir at kinvolk.io
Thu Sep 10 04:35:08 PDT 2015
On Wed, Sep 9, 2015 at 5:26 PM, Brian Paul <brianp at vmware.com> wrote:
> On 09/09/2015 04:35 AM, Krzesimir Nowak wrote:
>
>> This introduces new vfunc in tgsi_sampler just for this opcode. I
>> decided against extending get_samples vfunc to return the mipmap level
>> and LOD - the function's prototype is already too scary and doing the
>> sampling for textureQueryLod would be a waste of time.
>> ---
>> src/gallium/auxiliary/tgsi/tgsi_exec.c | 44
>> ++++++++++++++++++++++++++++++++++
>> src/gallium/auxiliary/tgsi/tgsi_exec.h | 10 ++++++++
>> 2 files changed, 54 insertions(+)
>>
>> diff --git a/src/gallium/auxiliary/tgsi/tgsi_exec.c
>> b/src/gallium/auxiliary/tgsi/tgsi_exec.c
>> index 9544623..054ad08 100644
>> --- a/src/gallium/auxiliary/tgsi/tgsi_exec.c
>> +++ b/src/gallium/auxiliary/tgsi/tgsi_exec.c
>> @@ -2132,6 +2132,44 @@ exec_tex(struct tgsi_exec_machine *mach,
>> }
>> }
>>
>> +static void
>> +exec_lodq(struct tgsi_exec_machine *mach,
>> + const struct tgsi_full_instruction *inst)
>> +{
>> + uint unit;
>> + int dim;
>> + int i;
>> + union tgsi_exec_channel coords[4];
>> + const union tgsi_exec_channel *args[Elements(coords)];
>> + union tgsi_exec_channel r[2];
>> +
>> + unit = fetch_sampler_unit(mach, inst, 1);
>> + dim = tgsi_util_get_texture_coord_dim(inst->Texture.Texture, NULL);
>> + assert(dim <= Elements(coords));
>> + /* fetch coordinates */
>> + for (i = 0; i < dim; i++) {
>> + FETCH(&coords[i], 0, TGSI_CHAN_X + i);
>> + args[i] = &coords[i];
>> + }
>> + for (i = dim; i < Elements(coords); i++) {
>> + args[i] = &ZeroVec;
>> + }
>> + mach->Sampler->query_lod(mach->Sampler, unit, unit,
>> + args[0]->f,
>> + args[1]->f,
>> + args[2]->f,
>> + args[3]->f,
>> + tgsi_sampler_lod_none,
>> + r[0].f,
>> + r[1].f);
>> +
>> + if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_X) {
>> + store_dest(mach, &r[0], &inst->Dst[0], inst, TGSI_CHAN_X,
>> TGSI_EXEC_DATA_FLOAT);
>> + }
>> + if (inst->Dst[0].Register.WriteMask & TGSI_WRITEMASK_Y) {
>> + store_dest(mach, &r[1], &inst->Dst[0], inst, TGSI_CHAN_Y,
>> TGSI_EXEC_DATA_FLOAT);
>> + }
>> +}
>>
>> static void
>> exec_txd(struct tgsi_exec_machine *mach,
>> @@ -4378,6 +4416,12 @@ exec_instruction(
>> exec_tex(mach, inst, TEX_MODIFIER_GATHER, 2);
>> break;
>>
>> + case TGSI_OPCODE_LODQ:
>> + /* src[0] = texcoord */
>> + /* src[1] = sampler unit */
>> + exec_lodq(mach, inst);
>> + break;
>> +
>> case TGSI_OPCODE_UP2H:
>> assert (0);
>> break;
>> diff --git a/src/gallium/auxiliary/tgsi/tgsi_exec.h
>> b/src/gallium/auxiliary/tgsi/tgsi_exec.h
>> index 5d56aab..556e0af 100644
>> --- a/src/gallium/auxiliary/tgsi/tgsi_exec.h
>> +++ b/src/gallium/auxiliary/tgsi/tgsi_exec.h
>> @@ -138,6 +138,16 @@ struct tgsi_sampler
>> const int j[TGSI_QUAD_SIZE], const int
>> k[TGSI_QUAD_SIZE],
>> const int lod[TGSI_QUAD_SIZE], const int8_t
>> offset[3],
>> float rgba[TGSI_NUM_CHANNELS][TGSI_QUAD_SIZE]);
>> + void (*query_lod)(struct tgsi_sampler *tgsi_sampler,
>>
>
> Can tgsi_sampler be const-qualified?
>
It cannot be. I tried, but later, on softpipe side, we get the sp_sampler
instance and modify it in convert_cube. It is nothing that ugly cast cannot
"fix", but yeah...
This seems like hack I could fix in followup commits:
http://cgit.freedesktop.org/mesa/mesa/tree/src/gallium/drivers/softpipe/sp_tex_sample.h?id=bf58a2c362d5afdba512f40b3eb300154201c7f0#n122
>
>
> + const unsigned sview_index,
>> + const unsigned sampler_index,
>> + const float s[TGSI_QUAD_SIZE],
>> + const float t[TGSI_QUAD_SIZE],
>> + const float p[TGSI_QUAD_SIZE],
>> + const float c0[TGSI_QUAD_SIZE],
>> + enum tgsi_sampler_control control,
>> + float mipmap[TGSI_QUAD_SIZE],
>> + float lod[TGSI_QUAD_SIZE]);
>> };
>>
>> #define TGSI_EXEC_NUM_TEMPS 4096
>>
>>
> Reviewed-by: Brian Paul <brianp at vmware.com>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20150910/58037f78/attachment-0001.html>
More information about the mesa-dev
mailing list