summaryrefslogtreecommitdiff
path: root/src/mesa/state_tracker
diff options
context:
space:
mode:
authorBen Skeggs <skeggsb@gmail.com>2008-03-25 12:14:49 +1100
committerBen Skeggs <skeggsb@gmail.com>2008-03-25 12:14:49 +1100
commit9e1f7b2c57154704d5881362a44da703b7a4a00f (patch)
tree9cd0ca55f1eb9a0908ae76f65cfda107a7aec0ca /src/mesa/state_tracker
parent601b018a9a6143c634239d5bb51616724c2e593d (diff)
parent4654803e2595ea041ea83baf5e13e6c68890e9a7 (diff)
Merge remote branch 'upstream/gallium-0.1' into nouveau-gallium-0.1
Diffstat (limited to 'src/mesa/state_tracker')
-rw-r--r--src/mesa/state_tracker/st_atom_texture.c31
-rw-r--r--src/mesa/state_tracker/st_cb_bitmap.c13
-rw-r--r--src/mesa/state_tracker/st_cb_drawpixels.c5
-rw-r--r--src/mesa/state_tracker/st_cb_program.c5
-rw-r--r--src/mesa/state_tracker/st_cb_program.h3
-rw-r--r--src/mesa/state_tracker/st_cb_texture.c27
-rw-r--r--src/mesa/state_tracker/st_context.c1
-rw-r--r--src/mesa/state_tracker/st_gen_mipmap.c3
-rw-r--r--src/mesa/state_tracker/st_program.h4
9 files changed, 48 insertions, 44 deletions
diff --git a/src/mesa/state_tracker/st_atom_texture.c b/src/mesa/state_tracker/st_atom_texture.c
index 9aef30f456..e1528c4d7b 100644
--- a/src/mesa/state_tracker/st_atom_texture.c
+++ b/src/mesa/state_tracker/st_atom_texture.c
@@ -56,28 +56,27 @@ update_textures(struct st_context *st)
for (unit = 0; unit < st->ctx->Const.MaxTextureCoordUnits; unit++) {
const GLuint su = fprog->Base.SamplerUnits[unit];
- struct gl_texture_object *texObj = st->ctx->Texture.Unit[su]._Current;
- struct st_texture_object *stObj = st_texture_object(texObj);
- struct pipe_texture *pt;
+ struct pipe_texture *pt = NULL;
- if (texObj) {
- GLboolean flush, retval;
+ if (fprog->Base.SamplersUsed & (1 << su)) {
+ struct gl_texture_object *texObj = st->ctx->Texture.Unit[su]._Current;
+ struct st_texture_object *stObj = st_texture_object(texObj);
- retval = st_finalize_texture(st->ctx, st->pipe, texObj, &flush);
- if (!retval) {
- /* out of mem */
- continue;
+ if (texObj) {
+ GLboolean flush, retval;
+
+ retval = st_finalize_texture(st->ctx, st->pipe, texObj, &flush);
+ if (!retval) {
+ /* out of mem */
+ continue;
+ }
+
+ st->state.num_textures = unit + 1;
}
- st->state.num_textures = unit + 1;
+ pt = st_get_stobj_texture(stObj);
}
- /* XXX: need to ensure that textures are unbound/removed from
- * this table before being deleted, otherwise the pointer
- * comparison below could fail.
- */
-
- pt = st_get_stobj_texture(stObj);
pipe_texture_reference(&st->state.sampler_texture[unit], pt);
}
diff --git a/src/mesa/state_tracker/st_cb_bitmap.c b/src/mesa/state_tracker/st_cb_bitmap.c
index acc22d4323..6e59439874 100644
--- a/src/mesa/state_tracker/st_cb_bitmap.c
+++ b/src/mesa/state_tracker/st_cb_bitmap.c
@@ -44,6 +44,7 @@
#include "st_atom_constbuf.h"
#include "st_program.h"
#include "st_cb_bitmap.h"
+#include "st_cb_program.h"
#include "st_mesa_to_tgsi.h"
#include "st_texture.h"
#include "pipe/p_context.h"
@@ -406,7 +407,7 @@ draw_bitmap_quad(GLcontext *ctx, GLint x, GLint y, GLfloat z,
assert(height <= maxSize);
cso_save_rasterizer(cso);
- //cso_save_viewport(cso);
+ cso_save_samplers(cso);
/* rasterizer state: just scissor */
{
@@ -457,11 +458,9 @@ draw_bitmap_quad(GLcontext *ctx, GLint x, GLint y, GLfloat z,
/* restore state */
cso_restore_rasterizer(cso);
cso_restore_samplers(cso);
- //cso_restore_viewport(cso);
/* shaders don't go through cso yet */
pipe->bind_fs_state(pipe, st->fp->driver_shader);
pipe->bind_vs_state(pipe, st->vp->driver_shader);
-
pipe->set_sampler_textures(pipe, ctx->st->state.num_textures,
ctx->st->state.sampler_texture);
}
@@ -513,7 +512,13 @@ st_destroy_bitmap(struct st_context *st)
{
struct pipe_context *pipe = st->pipe;
- /* XXX free frag shader state */
+ if (st->bitmap.combined_prog) {
+ st_delete_program(st->ctx, &st->bitmap.combined_prog->Base.Base);
+ }
+
+ if (st->bitmap.program) {
+ st_delete_program(st->ctx, &st->bitmap.program->Base.Base);
+ }
if (st->bitmap.vs) {
pipe->delete_vs_state(pipe, st->bitmap.vs);
diff --git a/src/mesa/state_tracker/st_cb_drawpixels.c b/src/mesa/state_tracker/st_cb_drawpixels.c
index 2ebaf8a2c3..0a2d37c117 100644
--- a/src/mesa/state_tracker/st_cb_drawpixels.c
+++ b/src/mesa/state_tracker/st_cb_drawpixels.c
@@ -523,6 +523,7 @@ draw_textured_quad(GLcontext *ctx, GLint x, GLint y, GLfloat z,
cso_save_rasterizer(cso);
cso_save_viewport(cso);
+ cso_save_samplers(cso);
/* rasterizer state: just scissor */
{
@@ -596,13 +597,11 @@ draw_textured_quad(GLcontext *ctx, GLint x, GLint y, GLfloat z,
/* restore state */
cso_restore_rasterizer(cso);
cso_restore_viewport(cso);
+ cso_restore_samplers(cso);
/* shaders don't go through cso yet */
pipe->bind_fs_state(pipe, st->fp->driver_shader);
pipe->bind_vs_state(pipe, st->vp->driver_shader);
- cso_set_rasterizer(cso, &st->state.rasterizer);
- cso_set_samplers(cso, PIPE_MAX_SAMPLERS,
- (const struct pipe_sampler_state **) st->state.sampler_list);
pipe->set_sampler_textures(pipe, ctx->st->state.num_textures,
ctx->st->state.sampler_texture);
}
diff --git a/src/mesa/state_tracker/st_cb_program.c b/src/mesa/state_tracker/st_cb_program.c
index a739fcd336..003ec0d2b7 100644
--- a/src/mesa/state_tracker/st_cb_program.c
+++ b/src/mesa/state_tracker/st_cb_program.c
@@ -45,6 +45,7 @@
#include "st_context.h"
#include "st_program.h"
#include "st_atom_shader.h"
+#include "st_cb_program.h"
static GLuint SerialNo = 1;
@@ -122,8 +123,8 @@ static struct gl_program *st_new_program( GLcontext *ctx,
}
-static void st_delete_program( GLcontext *ctx,
- struct gl_program *prog )
+void
+st_delete_program(GLcontext *ctx, struct gl_program *prog)
{
struct st_context *st = st_context(ctx);
struct pipe_context *pipe = st->pipe;
diff --git a/src/mesa/state_tracker/st_cb_program.h b/src/mesa/state_tracker/st_cb_program.h
index 45dc753dff..0de96f2fd2 100644
--- a/src/mesa/state_tracker/st_cb_program.h
+++ b/src/mesa/state_tracker/st_cb_program.h
@@ -32,5 +32,8 @@
extern void
st_init_program_functions(struct dd_function_table *functions);
+extern void
+st_delete_program(GLcontext *ctx, struct gl_program *prog);
+
#endif
diff --git a/src/mesa/state_tracker/st_cb_texture.c b/src/mesa/state_tracker/st_cb_texture.c
index a6c1a35355..d0bc234f36 100644
--- a/src/mesa/state_tracker/st_cb_texture.c
+++ b/src/mesa/state_tracker/st_cb_texture.c
@@ -265,19 +265,17 @@ guess_and_alloc_texture(struct st_context *st,
{
GLuint firstLevel;
GLuint lastLevel;
- GLuint width = stImage->base.Width;
- GLuint height = stImage->base.Height;
- GLuint depth = stImage->base.Depth;
+ GLuint width = stImage->base.Width2; /* size w/out border */
+ GLuint height = stImage->base.Height2;
+ GLuint depth = stImage->base.Depth2;
GLuint i, comp_byte = 0;
DBG("%s\n", __FUNCTION__);
assert(!stObj->pt);
- if (stImage->base.Border)
- return;
-
- if (stImage->level > stObj->base.BaseLevel &&
+ if (stObj->pt &&
+ stImage->level > stObj->base.BaseLevel &&
(stImage->base.Width == 1 ||
(stObj->base.Target != GL_TEXTURE_1D &&
stImage->base.Height == 1) ||
@@ -297,7 +295,8 @@ guess_and_alloc_texture(struct st_context *st,
/* Figure out image dimensions at start level.
*/
for (i = stImage->level; i > firstLevel; i--) {
- width <<= 1;
+ if (width != 1)
+ width <<= 1;
if (height != 1)
height <<= 1;
if (depth != 1)
@@ -1448,9 +1447,9 @@ st_finalize_texture(GLcontext *ctx,
stObj->pt->format !=
st_mesa_format_to_pipe_format(firstImage->base.TexFormat->MesaFormat) ||
stObj->pt->last_level != stObj->lastLevel ||
- stObj->pt->width[0] != firstImage->base.Width ||
- stObj->pt->height[0] != firstImage->base.Height ||
- stObj->pt->depth[0] != firstImage->base.Depth ||
+ stObj->pt->width[0] != firstImage->base.Width2 ||
+ stObj->pt->height[0] != firstImage->base.Height2 ||
+ stObj->pt->depth[0] != firstImage->base.Depth2 ||
stObj->pt->cpp != cpp ||
stObj->pt->compressed != firstImage->base.IsCompressed)) {
pipe_texture_release(&stObj->pt);
@@ -1464,9 +1463,9 @@ st_finalize_texture(GLcontext *ctx,
gl_target_to_pipe(stObj->base.Target),
st_mesa_format_to_pipe_format(firstImage->base.TexFormat->MesaFormat),
stObj->lastLevel,
- firstImage->base.Width,
- firstImage->base.Height,
- firstImage->base.Depth,
+ firstImage->base.Width2,
+ firstImage->base.Height2,
+ firstImage->base.Depth2,
comp_byte);
if (!stObj->pt) {
_mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage");
diff --git a/src/mesa/state_tracker/st_context.c b/src/mesa/state_tracker/st_context.c
index d9e8722976..7c18386575 100644
--- a/src/mesa/state_tracker/st_context.c
+++ b/src/mesa/state_tracker/st_context.c
@@ -42,6 +42,7 @@
#include "st_cb_drawpixels.h"
#include "st_cb_fbo.h"
#include "st_cb_feedback.h"
+#include "st_cb_program.h"
#include "st_cb_queryobj.h"
#include "st_cb_rasterpos.h"
#include "st_cb_readpixels.h"
diff --git a/src/mesa/state_tracker/st_gen_mipmap.c b/src/mesa/state_tracker/st_gen_mipmap.c
index 61e1d9621c..a931911227 100644
--- a/src/mesa/state_tracker/st_gen_mipmap.c
+++ b/src/mesa/state_tracker/st_gen_mipmap.c
@@ -92,7 +92,8 @@ st_render_mipmap(struct st_context *st,
return FALSE;
}
- util_gen_mipmap(st->gen_mipmap, pt, face, baseLevel, lastLevel);
+ util_gen_mipmap(st->gen_mipmap, pt, face, baseLevel, lastLevel,
+ PIPE_TEX_FILTER_LINEAR);
/* shaders don't go through CSO yet */
if (st->fp)
diff --git a/src/mesa/state_tracker/st_program.h b/src/mesa/state_tracker/st_program.h
index 9ef2a07eaa..63d6590540 100644
--- a/src/mesa/state_tracker/st_program.h
+++ b/src/mesa/state_tracker/st_program.h
@@ -97,10 +97,6 @@ struct st_vertex_program
};
-extern void
-st_init_program_functions(struct dd_function_table *functions);
-
-
static inline struct st_fragment_program *
st_fragment_program( struct gl_fragment_program *fp )
{