[Nouveau] [Mesa-dev] [PATCH 10/21] nouveau: Add support for ARB_sampler_object
Francisco Jerez
currojerez at riseup.net
Mon Jun 11 16:37:29 PDT 2012
Pauli Nieminen <pauli.nieminen at 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.nieminen at linux.intel.com>
> CC: nouveau at 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);
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 229 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/nouveau/attachments/20120612/d1eaeaa9/attachment.pgp>
More information about the Nouveau
mailing list