[Mesa-dev] [PATCH 10/21] nouveau: Add support for ARB_sampler_object

2012-06-11 Thread Pauli Nieminen
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.

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 = 

Re: [Mesa-dev] [PATCH 10/21] nouveau: Add support for ARB_sampler_object

2012-06-11 Thread Francisco Jerez
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 =