summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPauli Nieminen <pauli.nieminen@linux.intel.com>2012-06-08 23:51:19 +0300
committerPauli Nieminen <pauli.nieminen@linux.intel.com>2012-06-10 00:26:25 +0300
commitaf0e1bcae3b9e9323da45f837d34e076222825a6 (patch)
tree38250ad816e8cad3546b95cad1b19370d8dad31e
parent32b7a3c91260fb16411553fdfcfb0f6a580eb5de (diff)
nouveau: Add support for ARB_sampler_object
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.nieminen@linux.intel.com> CC: nouveau@lists.freedesktop.org
-rw-r--r--src/mesa/drivers/dri/nouveau/nv04_state_tex.c22
-rw-r--r--src/mesa/drivers/dri/nouveau/nv10_state_tex.c23
-rw-r--r--src/mesa/drivers/dri/nouveau/nv20_state_tex.c25
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 807e2f3dec..e4d695a34b 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 b467bb3314..3b76d66100 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 d8bfdf2e58..ffbc2dfe09 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);