summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPauli Nieminen <[email protected]>2012-06-12 21:38:50 +0300
committerEric Anholt <[email protected]>2012-08-01 15:31:16 -0700
commit54808e560f773f652919a2865c7371e4715df510 (patch)
tree674eac2f5cdb355982a9edcb172fd2d5db003eb5
parent765509903b3c560f9c19169d736f284480e88942 (diff)
nouveau: Add support for ARB_sampler_objects
ARB_sampler_objects is very simple software only extension to support. I want to make it a mandatory extension for Mesa drivers to allow the meta module to use it. This patch add support for the extension to nouveau. It is completely untested search and replace patch, except for flagging the texture state as needing to be recomputed when a sampler object is present. Signed-off-by: Pauli Nieminen <[email protected]>
-rw-r--r--src/mesa/drivers/dri/nouveau/nouveau_state.c7
-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
4 files changed, 46 insertions, 31 deletions
diff --git a/src/mesa/drivers/dri/nouveau/nouveau_state.c b/src/mesa/drivers/dri/nouveau/nouveau_state.c
index 1579d29efc2..5155da96eaa 100644
--- a/src/mesa/drivers/dri/nouveau/nouveau_state.c
+++ b/src/mesa/drivers/dri/nouveau/nouveau_state.c
@@ -495,6 +495,13 @@ nouveau_update_state(struct gl_context *ctx, GLbitfield new_state)
context_dirty(ctx, MATERIAL_BACK_SHININESS);
}
+ if (new_state & _NEW_TEXTURE) {
+ for (i = 0; i < ctx->Const.MaxTextureUnits; i++) {
+ if (ctx->Texture.Unit[i].Sampler)
+ context_dirty_i(ctx, TEX_OBJ, i);
+ }
+ }
+
_swrast_InvalidateState(ctx, new_state);
_tnl_InvalidateState(ctx, new_state);
diff --git a/src/mesa/drivers/dri/nouveau/nv04_state_tex.c b/src/mesa/drivers/dri/nouveau/nv04_state_tex.c
index 807e2f3dec9..e4d695a34be 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 b467bb33142..3b76d66100d 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 d8bfdf2e58f..ffbc2dfe09c 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);