Pauli Nieminen <pauli.niemi...@linux.intel.com> writes: > ARB_sampler_object is very simple software only extension to support. > I want to make it mandator extension for Mesa drivers to allow meta > module to use it. > > This patch add support for the extension to nouveau. It is completely > untested search and replace patch. I hope someone with old NV hardware > could give a try that there is no regressions and ARB_sampler_object > tests passes. >
Hey, I don't think this patch is enough to get ARB_sampler_objects working. First you need some way to find out that the current sampler has changed so the nvXX_emit_tex_obj() hooks are re-executed before rendering. Ideally it would be done using some kind of driver hook that would be called when a new sampler is bound (the implementation would be a one-liner, see nouveau_tex_parameter() in nouveau_state.c). Apparently glBindSampler() already sets the _NEW_TEXTURE flag so I guess another option could be to re-validate all the texture context for all texture units anytime it's seen set, though I'm not sure that would be a good idea. > Signed-off-by: Pauli Nieminen <pauli.niemi...@linux.intel.com> > CC: nouv...@lists.freedesktop.org > --- > src/mesa/drivers/dri/nouveau/nv04_state_tex.c | 22 ++++++++++++---------- > src/mesa/drivers/dri/nouveau/nv10_state_tex.c | 23 +++++++++++++---------- > src/mesa/drivers/dri/nouveau/nv20_state_tex.c | 25 > ++++++++++++++----------- > 3 files changed, 39 insertions(+), 31 deletions(-) > > diff --git a/src/mesa/drivers/dri/nouveau/nv04_state_tex.c > b/src/mesa/drivers/dri/nouveau/nv04_state_tex.c > index 807e2f3..e4d695a 100644 > --- a/src/mesa/drivers/dri/nouveau/nv04_state_tex.c > +++ b/src/mesa/drivers/dri/nouveau/nv04_state_tex.c > @@ -32,6 +32,7 @@ > #include "nv_object.xml.h" > #include "nv04_3d.xml.h" > #include "nv04_driver.h" > +#include "main/samplerobj.h" > > static uint32_t > get_tex_format(struct gl_texture_image *ti) > @@ -67,6 +68,7 @@ nv04_emit_tex_obj(struct gl_context *ctx, int emit) > if (ctx->Texture.Unit[i]._ReallyEnabled) { > struct gl_texture_object *t = ctx->Texture.Unit[i]._Current; > struct gl_texture_image *ti = t->Image[0][t->BaseLevel]; > + const struct gl_sampler_object *sa = _mesa_get_samplerobj(ctx, > i); > int lod_max = 1, lod_bias = 0; > > if (!nouveau_texture_validate(ctx, t)) > @@ -74,26 +76,26 @@ nv04_emit_tex_obj(struct gl_context *ctx, int emit) > > s = &to_nouveau_texture(t)->surfaces[t->BaseLevel]; > > - if (t->Sampler.MinFilter != GL_NEAREST && > - t->Sampler.MinFilter != GL_LINEAR) { > - lod_max = CLAMP(MIN2(t->Sampler.MaxLod, t->_MaxLambda), > + if (sa->MinFilter != GL_NEAREST && > + sa->MinFilter != GL_LINEAR) { > + lod_max = CLAMP(MIN2(sa->MaxLod, t->_MaxLambda), > 0, 15) + 1; > > lod_bias = CLAMP(ctx->Texture.Unit[i].LodBias + > - t->Sampler.LodBias, -16, 15) * 8; > + sa->LodBias, -16, 15) * 8; > } > > - format |= nvgl_wrap_mode(t->Sampler.WrapT) << 28 | > - nvgl_wrap_mode(t->Sampler.WrapS) << 24 | > + format |= nvgl_wrap_mode(sa->WrapT) << 28 | > + nvgl_wrap_mode(sa->WrapS) << 24 | > ti->HeightLog2 << 20 | > ti->WidthLog2 << 16 | > lod_max << 12 | > get_tex_format(ti); > > - filter |= log2i(t->Sampler.MaxAnisotropy) << 31 | > - nvgl_filter_mode(t->Sampler.MagFilter) << 28 | > - log2i(t->Sampler.MaxAnisotropy) << 27 | > - nvgl_filter_mode(t->Sampler.MinFilter) << 24 | > + filter |= log2i(sa->MaxAnisotropy) << 31 | > + nvgl_filter_mode(sa->MagFilter) << 28 | > + log2i(sa->MaxAnisotropy) << 27 | > + nvgl_filter_mode(sa->MinFilter) << 24 | > (lod_bias & 0xff) << 16; > > } else { > diff --git a/src/mesa/drivers/dri/nouveau/nv10_state_tex.c > b/src/mesa/drivers/dri/nouveau/nv10_state_tex.c > index b467bb3..3b76d66 100644 > --- a/src/mesa/drivers/dri/nouveau/nv10_state_tex.c > +++ b/src/mesa/drivers/dri/nouveau/nv10_state_tex.c > @@ -31,6 +31,7 @@ > #include "nv10_3d.xml.h" > #include "nouveau_util.h" > #include "nv10_driver.h" > +#include "main/samplerobj.h" > > void > nv10_emit_tex_gen(struct gl_context *ctx, int emit) > @@ -159,6 +160,7 @@ nv10_emit_tex_obj(struct gl_context *ctx, int emit) > struct gl_texture_object *t; > struct nouveau_surface *s; > struct gl_texture_image *ti; > + const struct gl_sampler_object *sa; > uint32_t tx_format, tx_filter, tx_enable; > > PUSH_RESET(push, BUFCTX_TEX(i)); > @@ -172,22 +174,23 @@ nv10_emit_tex_obj(struct gl_context *ctx, int emit) > t = ctx->Texture.Unit[i]._Current; > s = &to_nouveau_texture(t)->surfaces[t->BaseLevel]; > ti = t->Image[0][t->BaseLevel]; > + sa = _mesa_get_samplerobj(ctx, i); > > if (!nouveau_texture_validate(ctx, t)) > return; > > /* Recompute the texturing registers. */ > - tx_format = nvgl_wrap_mode(t->Sampler.WrapT) << 28 > - | nvgl_wrap_mode(t->Sampler.WrapS) << 24 > + tx_format = nvgl_wrap_mode(sa->WrapT) << 28 > + | nvgl_wrap_mode(sa->WrapS) << 24 > | ti->HeightLog2 << 20 > | ti->WidthLog2 << 16 > | 5 << 4 | 1 << 12; > > - tx_filter = nvgl_filter_mode(t->Sampler.MagFilter) << 28 > - | nvgl_filter_mode(t->Sampler.MinFilter) << 24; > + tx_filter = nvgl_filter_mode(sa->MagFilter) << 28 > + | nvgl_filter_mode(sa->MinFilter) << 24; > > tx_enable = NV10_3D_TEX_ENABLE_ENABLE > - | log2i(t->Sampler.MaxAnisotropy) << 4; > + | log2i(sa->MaxAnisotropy) << 4; > > if (t->Target == GL_TEXTURE_RECTANGLE) { > BEGIN_NV04(push, NV10_3D(TEX_NPOT_PITCH(i)), 1); > @@ -200,11 +203,11 @@ nv10_emit_tex_obj(struct gl_context *ctx, int emit) > tx_format |= get_tex_format_pot(ti); > } > > - if (t->Sampler.MinFilter != GL_NEAREST && > - t->Sampler.MinFilter != GL_LINEAR) { > - int lod_min = t->Sampler.MinLod; > - int lod_max = MIN2(t->Sampler.MaxLod, t->_MaxLambda); > - int lod_bias = t->Sampler.LodBias > + if (sa->MinFilter != GL_NEAREST && > + sa->MinFilter != GL_LINEAR) { > + int lod_min = sa->MinLod; > + int lod_max = MIN2(sa->MaxLod, t->_MaxLambda); > + int lod_bias = sa->LodBias > + ctx->Texture.Unit[i].LodBias; > > lod_max = CLAMP(lod_max, 0, 15); > diff --git a/src/mesa/drivers/dri/nouveau/nv20_state_tex.c > b/src/mesa/drivers/dri/nouveau/nv20_state_tex.c > index d8bfdf2..ffbc2df 100644 > --- a/src/mesa/drivers/dri/nouveau/nv20_state_tex.c > +++ b/src/mesa/drivers/dri/nouveau/nv20_state_tex.c > @@ -31,6 +31,7 @@ > #include "nv20_3d.xml.h" > #include "nouveau_util.h" > #include "nv20_driver.h" > +#include "main/samplerobj.h" > > void > nv20_emit_tex_gen(struct gl_context *ctx, int emit) > @@ -163,6 +164,7 @@ nv20_emit_tex_obj(struct gl_context *ctx, int emit) > struct gl_texture_object *t; > struct nouveau_surface *s; > struct gl_texture_image *ti; > + const struct gl_sampler_object *sa; > uint32_t tx_format, tx_filter, tx_wrap, tx_enable; > > PUSH_RESET(push, BUFCTX_TEX(i)); > @@ -178,6 +180,7 @@ nv20_emit_tex_obj(struct gl_context *ctx, int emit) > t = ctx->Texture.Unit[i]._Current; > s = &to_nouveau_texture(t)->surfaces[t->BaseLevel]; > ti = t->Image[0][t->BaseLevel]; > + sa = _mesa_get_samplerobj(ctx, i); > > if (!nouveau_texture_validate(ctx, t)) > return; > @@ -190,16 +193,16 @@ nv20_emit_tex_obj(struct gl_context *ctx, int emit) > | NV20_3D_TEX_FORMAT_NO_BORDER > | 1 << 16; > > - tx_wrap = nvgl_wrap_mode(t->Sampler.WrapR) << 16 > - | nvgl_wrap_mode(t->Sampler.WrapT) << 8 > - | nvgl_wrap_mode(t->Sampler.WrapS) << 0; > + tx_wrap = nvgl_wrap_mode(sa->WrapR) << 16 > + | nvgl_wrap_mode(sa->WrapT) << 8 > + | nvgl_wrap_mode(sa->WrapS) << 0; > > - tx_filter = nvgl_filter_mode(t->Sampler.MagFilter) << 24 > - | nvgl_filter_mode(t->Sampler.MinFilter) << 16 > + tx_filter = nvgl_filter_mode(sa->MagFilter) << 24 > + | nvgl_filter_mode(sa->MinFilter) << 16 > | 2 << 12; > > tx_enable = NV20_3D_TEX_ENABLE_ENABLE > - | log2i(t->Sampler.MaxAnisotropy) << 4; > + | log2i(sa->MaxAnisotropy) << 4; > > if (t->Target == GL_TEXTURE_RECTANGLE) { > BEGIN_NV04(push, NV20_3D(TEX_NPOT_PITCH(i)), 1); > @@ -212,11 +215,11 @@ nv20_emit_tex_obj(struct gl_context *ctx, int emit) > tx_format |= get_tex_format_pot(ti); > } > > - if (t->Sampler.MinFilter != GL_NEAREST && > - t->Sampler.MinFilter != GL_LINEAR) { > - int lod_min = t->Sampler.MinLod; > - int lod_max = MIN2(t->Sampler.MaxLod, t->_MaxLambda); > - int lod_bias = t->Sampler.LodBias > + if (sa->MinFilter != GL_NEAREST && > + sa->MinFilter != GL_LINEAR) { > + int lod_min = sa->MinLod; > + int lod_max = MIN2(sa->MaxLod, t->_MaxLambda); > + int lod_bias = sa->LodBias > + ctx->Texture.Unit[i].LodBias; > > lod_max = CLAMP(lod_max, 0, 15);
pgpTQpOC4U2Ww.pgp
Description: PGP signature
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev