Yes, using a new function is definitely the right way to go imho. Apart from the things mentioned by Brian, the series looks good to me.
Roland Am 09.09.2015 um 12:35 schrieb Krzesimir Nowak: > 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, > + 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 > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev