summaryrefslogtreecommitdiff
path: root/src/mesa/pipe/softpipe
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesa/pipe/softpipe')
-rw-r--r--src/mesa/pipe/softpipe/Makefile2
-rw-r--r--src/mesa/pipe/softpipe/sp_context.c42
-rw-r--r--src/mesa/pipe/softpipe/sp_context.h12
-rw-r--r--src/mesa/pipe/softpipe/sp_draw_arrays.c22
-rw-r--r--src/mesa/pipe/softpipe/sp_prim_setup.c35
-rw-r--r--src/mesa/pipe/softpipe/sp_quad_fs.c10
-rw-r--r--src/mesa/pipe/softpipe/sp_quad_occlusion.c16
-rw-r--r--src/mesa/pipe/softpipe/sp_query.c107
-rw-r--r--src/mesa/pipe/softpipe/sp_query.h (renamed from src/mesa/pipe/softpipe/sp_state_feedback.c)49
-rw-r--r--src/mesa/pipe/softpipe/sp_state.h16
-rw-r--r--src/mesa/pipe/softpipe/sp_state_sampler.c17
-rw-r--r--src/mesa/pipe/softpipe/sp_state_surface.c8
-rw-r--r--src/mesa/pipe/softpipe/sp_surface.c63
13 files changed, 220 insertions, 179 deletions
diff --git a/src/mesa/pipe/softpipe/Makefile b/src/mesa/pipe/softpipe/Makefile
index 647cc05373..31438a882e 100644
--- a/src/mesa/pipe/softpipe/Makefile
+++ b/src/mesa/pipe/softpipe/Makefile
@@ -7,6 +7,7 @@ LIBNAME = softpipe
DRIVER_SOURCES = \
sp_clear.c \
sp_flush.c \
+ sp_query.c \
sp_context.c \
sp_draw_arrays.c \
sp_prim_setup.c \
@@ -27,7 +28,6 @@ DRIVER_SOURCES = \
sp_state_blend.c \
sp_state_clip.c \
sp_state_derived.c \
- sp_state_feedback.c \
sp_state_fs.c \
sp_state_sampler.c \
sp_state_rasterizer.c \
diff --git a/src/mesa/pipe/softpipe/sp_context.c b/src/mesa/pipe/softpipe/sp_context.c
index 8b8e04c2f9..107c8f8597 100644
--- a/src/mesa/pipe/softpipe/sp_context.c
+++ b/src/mesa/pipe/softpipe/sp_context.c
@@ -42,6 +42,7 @@
#include "sp_tile_cache.h"
#include "sp_texture.h"
#include "sp_winsys.h"
+#include "sp_query.h"
@@ -150,37 +151,6 @@ static void softpipe_destroy( struct pipe_context *pipe )
}
-static void
-softpipe_begin_query(struct pipe_context *pipe, struct pipe_query_object *q)
-{
- struct softpipe_context *softpipe = softpipe_context( pipe );
- assert(q->type < PIPE_QUERY_TYPES);
- assert(!softpipe->queries[q->type]);
- softpipe->queries[q->type] = q;
-}
-
-
-static void
-softpipe_end_query(struct pipe_context *pipe, struct pipe_query_object *q)
-{
- struct softpipe_context *softpipe = softpipe_context( pipe );
- assert(q->type < PIPE_QUERY_TYPES);
- assert(softpipe->queries[q->type]);
- q->ready = 1; /* software rendering is synchronous */
- softpipe->queries[q->type] = NULL;
-}
-
-
-static void
-softpipe_wait_query(struct pipe_context *pipe, struct pipe_query_object *q)
-{
- /* Should never get here since we indicated that the result was
- * ready in softpipe_end_query().
- */
- assert(0);
-}
-
-
static const char *softpipe_get_name( struct pipe_context *pipe )
{
return "softpipe";
@@ -304,19 +274,15 @@ struct pipe_context *softpipe_create( struct pipe_winsys *pipe_winsys,
softpipe->pipe.set_blend_color = softpipe_set_blend_color;
softpipe->pipe.set_clip_state = softpipe_set_clip_state;
- softpipe->pipe.set_clear_color_state = softpipe_set_clear_color_state;
softpipe->pipe.set_constant_buffer = softpipe_set_constant_buffer;
- softpipe->pipe.set_feedback_state = softpipe_set_feedback_state;
softpipe->pipe.set_framebuffer_state = softpipe_set_framebuffer_state;
softpipe->pipe.set_polygon_stipple = softpipe_set_polygon_stipple;
- softpipe->pipe.set_sampler_units = softpipe_set_sampler_units;
softpipe->pipe.set_scissor_state = softpipe_set_scissor_state;
- softpipe->pipe.set_texture_state = softpipe_set_texture_state;
+ softpipe->pipe.set_sampler_texture = softpipe_set_sampler_texture;
softpipe->pipe.set_viewport_state = softpipe_set_viewport_state;
softpipe->pipe.set_vertex_buffer = softpipe_set_vertex_buffer;
softpipe->pipe.set_vertex_element = softpipe_set_vertex_element;
- softpipe->pipe.set_feedback_buffer = softpipe_set_feedback_buffer;
softpipe->pipe.draw_arrays = softpipe_draw_arrays;
softpipe->pipe.draw_elements = softpipe_draw_elements;
@@ -324,9 +290,7 @@ struct pipe_context *softpipe_create( struct pipe_winsys *pipe_winsys,
softpipe->pipe.clear = softpipe_clear;
softpipe->pipe.flush = softpipe_flush;
- softpipe->pipe.begin_query = softpipe_begin_query;
- softpipe->pipe.end_query = softpipe_end_query;
- softpipe->pipe.wait_query = softpipe_wait_query;
+ softpipe_init_query_funcs( softpipe );
/* textures */
softpipe->pipe.texture_create = softpipe_texture_create;
diff --git a/src/mesa/pipe/softpipe/sp_context.h b/src/mesa/pipe/softpipe/sp_context.h
index b97cdc52c6..2c038de5f7 100644
--- a/src/mesa/pipe/softpipe/sp_context.h
+++ b/src/mesa/pipe/softpipe/sp_context.h
@@ -82,10 +82,8 @@ struct softpipe_context {
const struct sp_vertex_shader_state *vs;
struct pipe_blend_color blend_color;
- struct pipe_clear_color_state clear_color;
struct pipe_clip_state clip;
struct pipe_constant_buffer constants[2];
- struct pipe_feedback_state feedback;
struct pipe_framebuffer_state framebuffer;
struct pipe_poly_stipple poly_stipple;
struct pipe_scissor_state scissor;
@@ -93,13 +91,12 @@ struct softpipe_context {
struct pipe_viewport_state viewport;
struct pipe_vertex_buffer vertex_buffer[PIPE_ATTRIB_MAX];
struct pipe_vertex_element vertex_element[PIPE_ATTRIB_MAX];
- uint sampler_units[PIPE_MAX_SAMPLERS];
unsigned dirty;
- /*
- * Active queries
+ /* Counter for occlusion queries. Note this supports overlapping
+ * queries.
*/
- struct pipe_query_object *queries[PIPE_QUERY_TYPES];
+ uint64_t occlusion_count;
/*
* Mapped vertex buffers
@@ -117,9 +114,6 @@ struct softpipe_context {
boolean need_w; /**< produce quad/fragment W values? */
int psize_slot;
- /** Feedback buffers */
- struct pipe_feedback_buffer feedback_buffer[PIPE_MAX_FEEDBACK_ATTRIBS];
-
#if 0
/* Stipple derived state:
*/
diff --git a/src/mesa/pipe/softpipe/sp_draw_arrays.c b/src/mesa/pipe/softpipe/sp_draw_arrays.c
index 93eb68405d..b7626f8a5f 100644
--- a/src/mesa/pipe/softpipe/sp_draw_arrays.c
+++ b/src/mesa/pipe/softpipe/sp_draw_arrays.c
@@ -138,18 +138,6 @@ softpipe_draw_elements(struct pipe_context *pipe,
draw_set_mapped_element_buffer(draw, 0, NULL);
}
- /* Map feedback buffers if enabled */
- if (sp->feedback.enabled) {
- const uint n = sp->feedback.interleaved ? 1 : sp->feedback.num_attribs;
- for (i = 0; i < n; i++) {
- void *ptr = pipe->winsys->buffer_map(pipe->winsys,
- sp->feedback_buffer[i].buffer,
- PIPE_BUFFER_FLAG_WRITE);
- draw_set_mapped_feedback_buffer(draw, i, ptr,
- sp->feedback_buffer[i].size);
- }
- }
-
/* draw! */
draw_arrays(draw, mode, start, count);
@@ -171,16 +159,6 @@ softpipe_draw_elements(struct pipe_context *pipe,
draw_set_mapped_element_buffer(draw, 0, NULL);
}
- /* Unmap feedback buffers if enabled */
- if (sp->feedback.enabled) {
- const uint n = sp->feedback.interleaved ? 1 : sp->feedback.num_attribs;
- for (i = 0; i < n; i++) {
- pipe->winsys->buffer_unmap(pipe->winsys,
- sp->feedback_buffer[i].buffer);
- draw_set_mapped_feedback_buffer(draw, i, NULL, 0);
- }
- }
-
/* Note: leave drawing surfaces mapped */
softpipe_unmap_constant_buffers(sp);
diff --git a/src/mesa/pipe/softpipe/sp_prim_setup.c b/src/mesa/pipe/softpipe/sp_prim_setup.c
index 6980564bdc..fc96f92af1 100644
--- a/src/mesa/pipe/softpipe/sp_prim_setup.c
+++ b/src/mesa/pipe/softpipe/sp_prim_setup.c
@@ -47,11 +47,11 @@
* Triangle edge info
*/
struct edge {
- float dx; /**< X(v1) - X(v0), used only during setup */
- float dy; /**< Y(v1) - Y(v0), used only during setup */
+ float dx; /**< X(v1) - X(v0), used only during setup */
+ float dy; /**< Y(v1) - Y(v0), used only during setup */
float dxdy; /**< dx/dy */
- float sx, sy; /**< first sample point coord */
- int lines; /**< number of lines on this edge */
+ float sx, sy; /**< first sample point coord */
+ int lines; /**< number of lines on this edge */
};
@@ -178,10 +178,9 @@ static INLINE int block( int x )
* this is pretty nasty... may need to rework flush_spans again to
* fix it, if possible.
*/
-static unsigned calculate_mask( struct setup_stage *setup,
- int x )
+static unsigned calculate_mask( struct setup_stage *setup, int x )
{
- unsigned mask = 0;
+ unsigned mask = 0x0;
if (x >= setup->span.left[0] && x < setup->span.right[0])
mask |= MASK_TOP_LEFT;
@@ -207,18 +206,21 @@ static void flush_spans( struct setup_stage *setup )
int minleft, maxright;
int x;
- switch (setup->span.y_flags) {
- case 3:
+ switch (setup->span.y_flags) {
+ case 0x3:
+ /* both odd and even lines written (both quad rows) */
minleft = MIN2(setup->span.left[0], setup->span.left[1]);
maxright = MAX2(setup->span.right[0], setup->span.right[1]);
break;
- case 1:
+ case 0x1:
+ /* only even line written (quad top row) */
minleft = setup->span.left[0];
maxright = setup->span.right[0];
break;
- case 2:
+ case 0x2:
+ /* only odd line written (quad bottom row) */
minleft = setup->span.left[1];
maxright = setup->span.right[1];
break;
@@ -227,12 +229,12 @@ static void flush_spans( struct setup_stage *setup )
return;
}
-
- for (x = block(minleft); x <= block(maxright); )
- {
+ /* XXX this loop could be moved into the above switch cases and
+ * calculate_mask() could be simplified a bit...
+ */
+ for (x = block(minleft); x <= block(maxright); x += 2) {
emit_quad( setup, x, setup->span.y,
calculate_mask( setup, x ) );
- x += 2;
}
setup->span.y = 0;
@@ -593,7 +595,8 @@ static void subtriangle( struct setup_stage *setup,
setup->span.y = block(_y);
}
- setup->span.left[_y&1] = left;setup->span.right[_y&1] = right;
+ setup->span.left[_y&1] = left;
+ setup->span.right[_y&1] = right;
setup->span.y_flags |= 1<<(_y&1);
}
}
diff --git a/src/mesa/pipe/softpipe/sp_quad_fs.c b/src/mesa/pipe/softpipe/sp_quad_fs.c
index 75576a9bde..251b47341a 100644
--- a/src/mesa/pipe/softpipe/sp_quad_fs.c
+++ b/src/mesa/pipe/softpipe/sp_quad_fs.c
@@ -98,7 +98,6 @@ shade_quad(
/* Consts does not require 16 byte alignment. */
machine->Consts = softpipe->mapped_constants[PIPE_SHADER_FRAGMENT];
- machine->SamplerUnits = softpipe->sampler_units;
machine->InterpCoefs = quad->coef;
machine->Inputs[0].xyzw[0].f[0] = fx;
@@ -174,12 +173,11 @@ shade_quad_llvm(struct quad_stage *qs,
{
struct quad_shade_stage *qss = quad_shade_stage(qs);
struct softpipe_context *softpipe = qs->softpipe;
- float dests[4][16][4];
+ float dests[4][16][4] ALIGN16_ATTRIB;
+ float inputs[4][16][4] ALIGN16_ATTRIB;
const float fx = (float) quad->x0;
const float fy = (float) quad->y0;
struct gallivm_prog *llvm = qss->llvm_prog;
- float inputs[4][16][4];
- memset(inputs, 0, sizeof(inputs));
inputs[0][0][0] = fx;
inputs[1][0][0] = fx + 1.0f;
@@ -203,10 +201,10 @@ shade_quad_llvm(struct quad_stage *qs,
}
#endif
- /*quad->mask &=*/
+ quad->mask &=
gallivm_fragment_shader_exec(llvm, fx, fy, dests, inputs,
softpipe->mapped_constants[PIPE_SHADER_FRAGMENT],
- qss->samplers, softpipe->sampler_units);
+ qss->samplers);
#if DLLVM
printf("OUT LLVM = 1[%f %f %f %f], 2[%f %f %f %f]\n",
dests[0][0][0], dests[0][0][1], dests[0][0][2], dests[0][0][3],
diff --git a/src/mesa/pipe/softpipe/sp_quad_occlusion.c b/src/mesa/pipe/softpipe/sp_quad_occlusion.c
index d65fdbdab7..54254df1f1 100644
--- a/src/mesa/pipe/softpipe/sp_quad_occlusion.c
+++ b/src/mesa/pipe/softpipe/sp_quad_occlusion.c
@@ -39,18 +39,22 @@
#include "sp_surface.h"
#include "sp_quad.h"
+static unsigned count_bits( unsigned val )
+{
+ unsigned i;
+
+ for (i = 0; val ; val >>= 1)
+ i += (val & 1);
+
+ return i;
+}
static void
occlusion_count_quad(struct quad_stage *qs, struct quad_header *quad)
{
struct softpipe_context *softpipe = qs->softpipe;
- struct pipe_query_object *occ
- = softpipe->queries[PIPE_QUERY_OCCLUSION_COUNTER];
- occ->count += (quad->mask ) & 1;
- occ->count += (quad->mask >> 1) & 1;
- occ->count += (quad->mask >> 2) & 1;
- occ->count += (quad->mask >> 3) & 1;
+ softpipe->occlusion_count += count_bits(quad->mask);
qs->next->run(qs->next, quad);
}
diff --git a/src/mesa/pipe/softpipe/sp_query.c b/src/mesa/pipe/softpipe/sp_query.c
new file mode 100644
index 0000000000..bf753dad98
--- /dev/null
+++ b/src/mesa/pipe/softpipe/sp_query.c
@@ -0,0 +1,107 @@
+/**************************************************************************
+ *
+ * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
+ * All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sub license, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
+ * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ **************************************************************************/
+
+/* Author:
+ * Keith Whitwell <keith@tungstengraphics.com>
+ */
+
+#include "pipe/draw/draw_context.h"
+#include "pipe/p_defines.h"
+#include "pipe/p_inlines.h"
+#include "pipe/p_util.h"
+#include "sp_context.h"
+#include "sp_query.h"
+
+struct softpipe_query {
+ uint64_t start;
+ uint64_t end;
+};
+
+
+static struct softpipe_query *softpipe_query( struct pipe_query *p )
+{
+ return (struct softpipe_query *)p;
+}
+
+static struct pipe_query *
+softpipe_create_query(struct pipe_context *pipe,
+ unsigned type)
+{
+ assert(type == PIPE_QUERY_OCCLUSION_COUNTER);
+ return (struct pipe_query *)CALLOC_STRUCT( softpipe_query );
+}
+
+
+static void
+softpipe_destroy_query(struct pipe_context *pipe, struct pipe_query *q)
+{
+ FREE(q);
+}
+
+
+static void
+softpipe_begin_query(struct pipe_context *pipe, struct pipe_query *q)
+{
+ struct softpipe_context *softpipe = softpipe_context( pipe );
+ struct softpipe_query *sq = softpipe_query(q);
+
+ sq->start = softpipe->occlusion_count;
+}
+
+
+static void
+softpipe_end_query(struct pipe_context *pipe, struct pipe_query *q)
+{
+ struct softpipe_context *softpipe = softpipe_context( pipe );
+ struct softpipe_query *sq = softpipe_query(q);
+
+ sq->end = softpipe->occlusion_count;
+}
+
+
+static boolean
+softpipe_get_query_result(struct pipe_context *pipe,
+ struct pipe_query *q,
+ boolean wait,
+ uint64_t *result )
+{
+ struct softpipe_query *sq = softpipe_query(q);
+ *result = sq->end - sq->start;
+ return TRUE;
+}
+
+
+void softpipe_init_query_funcs(struct softpipe_context *softpipe )
+{
+ softpipe->pipe.create_query = softpipe_create_query;
+ softpipe->pipe.destroy_query = softpipe_destroy_query;
+ softpipe->pipe.begin_query = softpipe_begin_query;
+ softpipe->pipe.end_query = softpipe_end_query;
+ softpipe->pipe.get_query_result = softpipe_get_query_result;
+}
+
+
diff --git a/src/mesa/pipe/softpipe/sp_state_feedback.c b/src/mesa/pipe/softpipe/sp_query.h
index 02aaf34e75..05060a4575 100644
--- a/src/mesa/pipe/softpipe/sp_state_feedback.c
+++ b/src/mesa/pipe/softpipe/sp_query.h
@@ -2,7 +2,7 @@
*
* Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
* All Rights Reserved.
- *
+ *
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
@@ -25,48 +25,15 @@
*
**************************************************************************/
-/**
- * Authors:
- * Brian Paul
+/* Author:
+ * Keith Whitwell
*/
+#ifndef SP_QUERY_H
+#define SP_QUERY_H
-#include "sp_context.h"
-#include "sp_state.h"
-#include "sp_surface.h"
-
-#include "pipe/p_winsys.h"
-#include "pipe/draw/draw_context.h"
-
-
-void
-softpipe_set_feedback_state(struct pipe_context *pipe,
- const struct pipe_feedback_state *feedback)
-{
- struct softpipe_context *softpipe = softpipe_context(pipe);
-
- softpipe->feedback = *feedback; /* struct copy */
- /*
- softpipe->dirty |= SP_NEW_FEEDBACK;
- */
-
- draw_set_feedback_state(softpipe->draw, feedback);
-}
-
-
-void
-softpipe_set_feedback_buffer(struct pipe_context *pipe,
- unsigned index,
- const struct pipe_feedback_buffer *feedback)
-{
- struct softpipe_context *softpipe = softpipe_context(pipe);
+struct softpipe_context;
+extern void softpipe_init_query_funcs(struct softpipe_context * );
- assert(index < PIPE_MAX_FEEDBACK_ATTRIBS);
- /* Need to be careful with referencing */
- pipe->winsys->buffer_reference(pipe->winsys,
- &softpipe->feedback_buffer[index].buffer,
- feedback->buffer);
- softpipe->feedback_buffer[index].size = feedback->size;
- softpipe->feedback_buffer[index].start_offset = feedback->start_offset;
-}
+#endif /* SP_QUERY_H */
diff --git a/src/mesa/pipe/softpipe/sp_state.h b/src/mesa/pipe/softpipe/sp_state.h
index ea9d2e62be..a3bd078a71 100644
--- a/src/mesa/pipe/softpipe/sp_state.h
+++ b/src/mesa/pipe/softpipe/sp_state.h
@@ -92,9 +92,6 @@ void softpipe_set_framebuffer_state( struct pipe_context *,
void softpipe_set_blend_color( struct pipe_context *pipe,
const struct pipe_blend_color *blend_color );
-void softpipe_set_clear_color_state( struct pipe_context *,
- const struct pipe_clear_color_state * );
-
void softpipe_set_clip_state( struct pipe_context *,
const struct pipe_clip_state * );
@@ -102,9 +99,6 @@ void softpipe_set_constant_buffer(struct pipe_context *,
uint shader, uint index,
const struct pipe_constant_buffer *buf);
-void softpipe_set_feedback_state( struct pipe_context *,
- const struct pipe_feedback_state * );
-
void *softpipe_create_fs_state(struct pipe_context *,
const struct pipe_shader_state *);
void softpipe_bind_fs_state(struct pipe_context *, void *);
@@ -117,13 +111,10 @@ void softpipe_delete_vs_state(struct pipe_context *, void *);
void softpipe_set_polygon_stipple( struct pipe_context *,
const struct pipe_poly_stipple * );
-void softpipe_set_sampler_units( struct pipe_context *,
- uint numSamplers, const uint *units );
-
void softpipe_set_scissor_state( struct pipe_context *,
const struct pipe_scissor_state * );
-void softpipe_set_texture_state( struct pipe_context *,
+void softpipe_set_sampler_texture( struct pipe_context *,
unsigned unit,
struct pipe_texture * );
@@ -138,11 +129,6 @@ void softpipe_set_vertex_buffer(struct pipe_context *,
unsigned index,
const struct pipe_vertex_buffer *);
-void softpipe_set_feedback_buffer(struct pipe_context *,
- uint index,
- const struct pipe_feedback_buffer *);
-
-
void softpipe_update_derived( struct softpipe_context *softpipe );
diff --git a/src/mesa/pipe/softpipe/sp_state_sampler.c b/src/mesa/pipe/softpipe/sp_state_sampler.c
index 173901f04e..3842e71503 100644
--- a/src/mesa/pipe/softpipe/sp_state_sampler.c
+++ b/src/mesa/pipe/softpipe/sp_state_sampler.c
@@ -67,9 +67,9 @@ softpipe_delete_sampler_state(struct pipe_context *pipe,
void
-softpipe_set_texture_state(struct pipe_context *pipe,
- unsigned unit,
- struct pipe_texture *texture)
+softpipe_set_sampler_texture(struct pipe_context *pipe,
+ unsigned unit,
+ struct pipe_texture *texture)
{
struct softpipe_context *softpipe = softpipe_context(pipe);
@@ -82,15 +82,4 @@ softpipe_set_texture_state(struct pipe_context *pipe,
}
-void
-softpipe_set_sampler_units(struct pipe_context *pipe,
- uint num_samplers, const uint *units )
-{
- struct softpipe_context *softpipe = softpipe_context(pipe);
- uint i;
- for (i = 0; i < num_samplers; i++)
- softpipe->sampler_units[i] = units[i];
- softpipe->dirty |= SP_NEW_SAMPLER;
-}
-
diff --git a/src/mesa/pipe/softpipe/sp_state_surface.c b/src/mesa/pipe/softpipe/sp_state_surface.c
index 30bedc74bc..ee72aaf4c5 100644
--- a/src/mesa/pipe/softpipe/sp_state_surface.c
+++ b/src/mesa/pipe/softpipe/sp_state_surface.c
@@ -131,11 +131,3 @@ softpipe_set_framebuffer_state(struct pipe_context *pipe,
-void
-softpipe_set_clear_color_state(struct pipe_context *pipe,
- const struct pipe_clear_color_state *clear)
-{
- struct softpipe_context *softpipe = softpipe_context(pipe);
-
- softpipe->clear_color = *clear; /* struct copy */
-}
diff --git a/src/mesa/pipe/softpipe/sp_surface.c b/src/mesa/pipe/softpipe/sp_surface.c
index 55b8b85ef2..1dc494d6ff 100644
--- a/src/mesa/pipe/softpipe/sp_surface.c
+++ b/src/mesa/pipe/softpipe/sp_surface.c
@@ -215,6 +215,59 @@ a1r5g5b5_get_tile(struct pipe_surface *ps,
}
+/*** PIPE_FORMAT_A4R4G4B4_UNORM ***/
+
+static void
+a4r4g4b4_get_tile(struct pipe_surface *ps,
+ unsigned x, unsigned y, unsigned w, unsigned h, float *p)
+{
+ const ushort *src
+ = ((const ushort *) (ps->map))
+ + y * ps->pitch + x;
+ unsigned i, j;
+
+ assert(ps->format == PIPE_FORMAT_A4R4G4B4_UNORM);
+
+ for (i = 0; i < h; i++) {
+ for (j = 0; j < w; j++) {
+ const ushort pixel = src[j];
+ p[0] = ((pixel >> 8) & 0xf) * (1.0f / 15.0f);
+ p[1] = ((pixel >> 4) & 0xf) * (1.0f / 15.0f);
+ p[2] = ((pixel ) & 0xf) * (1.0f / 15.0f);
+ p[3] = ((pixel >> 12) ) * (1.0f / 15.0f);
+ p += 4;
+ }
+ src += ps->pitch;
+ }
+}
+
+
+/*** PIPE_FORMAT_R5G6B5_UNORM ***/
+
+static void
+r5g6b5_get_tile(struct pipe_surface *ps,
+ unsigned x, unsigned y, unsigned w, unsigned h, float *p)
+{
+ const ushort *src
+ = ((const ushort *) (ps->map))
+ + y * ps->pitch + x;
+ unsigned i, j;
+
+ assert(ps->format == PIPE_FORMAT_R5G6B5_UNORM);
+
+ for (i = 0; i < h; i++) {
+ for (j = 0; j < w; j++) {
+ const ushort pixel = src[j];
+ p[0] = ((pixel >> 11) & 0x1f) * (1.0f / 31.0f);
+ p[1] = ((pixel >> 5) & 0x3f) * (1.0f / 63.0f);
+ p[2] = ((pixel ) & 0x1f) * (1.0f / 31.0f);
+ p[3] = 1.0f;
+ p += 4;
+ }
+ src += ps->pitch;
+ }
+}
+
/*** PIPE_FORMAT_Z16_UNORM ***/
@@ -576,11 +629,11 @@ softpipe_get_tex_surface(struct pipe_context *pipe,
assert(zslice == 0);
}
- ps = pipe->winsys->surface_alloc(pipe->winsys, pt->format);
+ ps = pipe->winsys->surface_alloc(pipe->winsys);
if (ps) {
- assert(ps->format);
assert(ps->refcount);
pipe->winsys->buffer_reference(pipe->winsys, &ps->buffer, spt->buffer);
+ ps->format = pt->format;
ps->cpp = pt->cpp;
ps->width = pt->width[level];
ps->height = pt->height[level];
@@ -674,6 +727,12 @@ softpipe_get_tile_rgba(struct pipe_context *pipe,
case PIPE_FORMAT_A1R5G5B5_UNORM:
a1r5g5b5_get_tile(ps, x, y, w, h, p);
break;
+ case PIPE_FORMAT_A4R4G4B4_UNORM:
+ a4r4g4b4_get_tile(ps, x, y, w, h, p);
+ break;
+ case PIPE_FORMAT_R5G6B5_UNORM:
+ r5g6b5_get_tile(ps, x, y, w, h, p);
+ break;
case PIPE_FORMAT_U_L8:
l8_get_tile(ps, x, y, w, h, p);
break;