summaryrefslogtreecommitdiff
path: root/src/gallium
diff options
context:
space:
mode:
authorBen Skeggs <skeggsb@gmail.com>2008-08-14 00:20:52 +1000
committerBen Skeggs <skeggsb@gmail.com>2008-08-14 00:20:52 +1000
commit56f5c0c001c476b813c94d071ac880fbe8d9768b (patch)
tree257e2d7c3870a741ad30ea7bc38621d9eb728483 /src/gallium
parentdf4228deddea36b9d5b41ea395a216137e046205 (diff)
parentd8be393cb60d908f98f0edb74c1c7964e8f690fe (diff)
Merge remote branch 'origin/gallium-0.1' into nouveau-gallium-0.1
Diffstat (limited to 'src/gallium')
-rw-r--r--src/gallium/auxiliary/draw/draw_pipe_aapoint.c4
-rw-r--r--src/gallium/auxiliary/draw/draw_pipe_pstipple.c4
-rw-r--r--src/gallium/auxiliary/draw/draw_pipe_wide_point.c21
-rw-r--r--src/gallium/auxiliary/gallivm/instructions.cpp4
-rw-r--r--src/gallium/auxiliary/gallivm/instructions.h2
-rw-r--r--src/gallium/auxiliary/gallivm/llvm_builtins.c2
-rw-r--r--src/gallium/auxiliary/gallivm/tgsitollvm.cpp18
-rw-r--r--src/gallium/auxiliary/tgsi/tgsi_exec.c38
-rw-r--r--src/gallium/auxiliary/tgsi/tgsi_sse2.c16
-rw-r--r--src/gallium/auxiliary/util/p_debug.c4
-rw-r--r--src/gallium/auxiliary/util/u_string.h12
-rw-r--r--src/gallium/drivers/cell/spu/spu_exec.c21
-rw-r--r--src/gallium/drivers/i915simple/i915_fpc_translate.c16
-rw-r--r--src/gallium/drivers/softpipe/sp_setup.c6
-rw-r--r--src/gallium/drivers/trace/tr_context.c142
-rw-r--r--src/gallium/drivers/trace/tr_context.h5
-rw-r--r--src/gallium/drivers/trace/tr_dump.c11
-rw-r--r--src/gallium/drivers/trace/tr_screen.c13
-rw-r--r--src/gallium/drivers/trace/tr_state.c15
-rw-r--r--src/gallium/drivers/trace/tr_winsys.c68
-rw-r--r--src/gallium/include/pipe/p_compiler.h5
-rw-r--r--src/gallium/include/pipe/p_shader_tokens.h4
-rw-r--r--src/gallium/include/pipe/p_state.h51
-rw-r--r--src/gallium/state_trackers/python/README6
-rw-r--r--src/gallium/state_trackers/python/gallium.i511
-rw-r--r--src/gallium/state_trackers/python/p_compiler.i29
-rw-r--r--src/gallium/state_trackers/python/p_context.i257
-rw-r--r--src/gallium/state_trackers/python/p_device.i130
-rw-r--r--src/gallium/state_trackers/python/p_state.i103
-rw-r--r--src/gallium/state_trackers/python/p_texture.i192
-rw-r--r--src/gallium/state_trackers/python/st_device.c33
-rw-r--r--src/gallium/state_trackers/python/st_device.h14
-rw-r--r--src/gallium/winsys/gdi/wgl.c2
33 files changed, 1042 insertions, 717 deletions
diff --git a/src/gallium/auxiliary/draw/draw_pipe_aapoint.c b/src/gallium/auxiliary/draw/draw_pipe_aapoint.c
index 13b4401521..c7f4349cb3 100644
--- a/src/gallium/auxiliary/draw/draw_pipe_aapoint.c
+++ b/src/gallium/auxiliary/draw/draw_pipe_aapoint.c
@@ -301,9 +301,9 @@ aa_transform_inst(struct tgsi_transform_context *ctx,
newInst.FullSrcRegisters[1].SrcRegister.SwizzleY = TGSI_SWIZZLE_W;
ctx->emit_instruction(ctx, &newInst);
- /* KILP -t0.yyyy; # if b, KILL */
+ /* KIL -tmp0.yyyy; # if -tmp0.y < 0, KILL */
newInst = tgsi_default_full_instruction();
- newInst.Instruction.Opcode = TGSI_OPCODE_KILP;
+ newInst.Instruction.Opcode = TGSI_OPCODE_KIL;
newInst.Instruction.NumDstRegs = 0;
newInst.Instruction.NumSrcRegs = 1;
newInst.FullSrcRegisters[0].SrcRegister.File = TGSI_FILE_TEMPORARY;
diff --git a/src/gallium/auxiliary/draw/draw_pipe_pstipple.c b/src/gallium/auxiliary/draw/draw_pipe_pstipple.c
index d3bd9baddd..e97136fa1f 100644
--- a/src/gallium/auxiliary/draw/draw_pipe_pstipple.c
+++ b/src/gallium/auxiliary/draw/draw_pipe_pstipple.c
@@ -299,9 +299,9 @@ pstip_transform_inst(struct tgsi_transform_context *ctx,
newInst.FullSrcRegisters[1].SrcRegister.Index = pctx->freeSampler;
ctx->emit_instruction(ctx, &newInst);
- /* KILP texTemp; # if texTemp < 0, KILL fragment */
+ /* KIL -texTemp; # if -texTemp < 0, KILL fragment */
newInst = tgsi_default_full_instruction();
- newInst.Instruction.Opcode = TGSI_OPCODE_KILP;
+ newInst.Instruction.Opcode = TGSI_OPCODE_KIL;
newInst.Instruction.NumDstRegs = 0;
newInst.Instruction.NumSrcRegs = 1;
newInst.FullSrcRegisters[0].SrcRegister.File = TGSI_FILE_TEMPORARY;
diff --git a/src/gallium/auxiliary/draw/draw_pipe_wide_point.c b/src/gallium/auxiliary/draw/draw_pipe_wide_point.c
index d40a07f4ae..54590984c6 100644
--- a/src/gallium/auxiliary/draw/draw_pipe_wide_point.c
+++ b/src/gallium/auxiliary/draw/draw_pipe_wide_point.c
@@ -50,6 +50,8 @@ struct widepoint_stage {
uint num_texcoords;
int psize_slot;
+
+ int point_coord_fs_input; /**< input for pointcoord (and fog) */
};
@@ -84,6 +86,13 @@ static void set_texcoords(const struct widepoint_stage *wide,
v->data[j][3] = tc[3];
}
}
+
+ if (wide->point_coord_fs_input >= 0) {
+ /* put gl_PointCoord into extra vertex output's zw components */
+ uint k = wide->stage.draw->extra_vp_outputs.slot;
+ v->data[k][2] = tc[0];
+ v->data[k][3] = tc[1];
+ }
}
@@ -208,6 +217,18 @@ static void widepoint_first_point( struct draw_stage *stage,
}
}
wide->num_texcoords = j;
+
+ /* find fragment shader PointCoord/Fog input */
+ wide->point_coord_fs_input = 0; /* XXX fix this! */
+
+ /* setup extra vp output */
+ draw->extra_vp_outputs.semantic_name = TGSI_SEMANTIC_FOG;
+ draw->extra_vp_outputs.semantic_index = 0;
+ draw->extra_vp_outputs.slot = draw->vs.num_vs_outputs;
+ }
+ else {
+ wide->point_coord_fs_input = -1;
+ draw->extra_vp_outputs.slot = 0;
}
wide->psize_slot = -1;
diff --git a/src/gallium/auxiliary/gallivm/instructions.cpp b/src/gallium/auxiliary/gallivm/instructions.cpp
index 1a98491b82..035224e8f3 100644
--- a/src/gallium/auxiliary/gallivm/instructions.cpp
+++ b/src/gallium/auxiliary/gallivm/instructions.cpp
@@ -878,9 +878,9 @@ llvm::Value * Instructions::scs(llvm::Value *in)
return call;
}
-llvm::Value * Instructions::kilp(llvm::Value *in)
+llvm::Value * Instructions::kil(llvm::Value *in)
{
- llvm::Function *func = m_mod->getFunction("kilp");
+ llvm::Function *func = m_mod->getFunction("kil");
assert(func);
CallInst *call = m_builder.CreateCall(func, in, name("kilpres"));
diff --git a/src/gallium/auxiliary/gallivm/instructions.h b/src/gallium/auxiliary/gallivm/instructions.h
index 3a476928b6..d286ce80c7 100644
--- a/src/gallium/auxiliary/gallivm/instructions.h
+++ b/src/gallium/auxiliary/gallivm/instructions.h
@@ -79,7 +79,7 @@ public:
llvm::Value *floor(llvm::Value *in);
llvm::Value *frc(llvm::Value *in);
void ifop(llvm::Value *in);
- llvm::Value *kilp(llvm::Value *in);
+ llvm::Value *kil(llvm::Value *in);
llvm::Value *lerp(llvm::Value *in1, llvm::Value *in2,
llvm::Value *in3);
llvm::Value *lit(llvm::Value *in);
diff --git a/src/gallium/auxiliary/gallivm/llvm_builtins.c b/src/gallium/auxiliary/gallivm/llvm_builtins.c
index 6b9d626ed4..d5a003a48b 100644
--- a/src/gallium/auxiliary/gallivm/llvm_builtins.c
+++ b/src/gallium/auxiliary/gallivm/llvm_builtins.c
@@ -105,7 +105,7 @@ inline float4 vsin(float4 val)
return result;
}
-inline int kilp(float4 val)
+inline int kil(float4 val)
{
if (val.x < 0 || val.y < 0 || val.z < 0 || val.w < 0)
return 1;
diff --git a/src/gallium/auxiliary/gallivm/tgsitollvm.cpp b/src/gallium/auxiliary/gallivm/tgsitollvm.cpp
index b14e2affd6..cc1516a45e 100644
--- a/src/gallium/auxiliary/gallivm/tgsitollvm.cpp
+++ b/src/gallium/auxiliary/gallivm/tgsitollvm.cpp
@@ -396,11 +396,7 @@ translate_instruction(llvm::Module *module,
break;
case TGSI_OPCODE_DDY:
break;
- case TGSI_OPCODE_KILP: {
- out = instr->kilp(inputs[0]);
- storage->setKilElement(out);
- return;
- }
+ case TGSI_OPCODE_KILP:
break;
case TGSI_OPCODE_PK2H:
break;
@@ -602,7 +598,11 @@ translate_instruction(llvm::Module *module,
break;
case TGSI_OPCODE_BREAKC:
break;
- case TGSI_OPCODE_KIL:
+ case TGSI_OPCODE_KIL: {
+ out = instr->kil(inputs[0]);
+ storage->setKilElement(out);
+ return;
+ }
break;
case TGSI_OPCODE_END:
instr->end();
@@ -799,8 +799,7 @@ translate_instructionir(llvm::Module *module,
break;
case TGSI_OPCODE_DDY:
break;
- case TGSI_OPCODE_KILP: {
- }
+ case TGSI_OPCODE_KILP:
break;
case TGSI_OPCODE_PK2H:
break;
@@ -967,7 +966,8 @@ translate_instructionir(llvm::Module *module,
break;
case TGSI_OPCODE_BREAKC:
break;
- case TGSI_OPCODE_KIL:
+ case TGSI_OPCODE_KIL: {
+ }
break;
case TGSI_OPCODE_END:
instr->end();
diff --git a/src/gallium/auxiliary/tgsi/tgsi_exec.c b/src/gallium/auxiliary/tgsi/tgsi_exec.c
index 8b430548bc..c4ba667d32 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_exec.c
+++ b/src/gallium/auxiliary/tgsi/tgsi_exec.c
@@ -393,10 +393,18 @@ micro_div(
const union tgsi_exec_channel *src0,
const union tgsi_exec_channel *src1 )
{
- dst->f[0] = src0->f[0] / src1->f[0];
- dst->f[1] = src0->f[1] / src1->f[1];
- dst->f[2] = src0->f[2] / src1->f[2];
- dst->f[3] = src0->f[3] / src1->f[3];
+ if (src1->f[0] != 0) {
+ dst->f[0] = src0->f[0] / src1->f[0];
+ }
+ if (src1->f[1] != 0) {
+ dst->f[1] = src0->f[1] / src1->f[1];
+ }
+ if (src1->f[2] != 0) {
+ dst->f[2] = src0->f[2] / src1->f[2];
+ }
+ if (src1->f[3] != 0) {
+ dst->f[3] = src0->f[3] / src1->f[3];
+ }
}
static void
@@ -1181,8 +1189,8 @@ store_dest(
* Kill fragment if any of the four values is less than zero.
*/
static void
-exec_kilp(struct tgsi_exec_machine *mach,
- const struct tgsi_full_instruction *inst)
+exec_kil(struct tgsi_exec_machine *mach,
+ const struct tgsi_full_instruction *inst)
{
uint uniquemask;
uint chan_index;
@@ -1218,6 +1226,21 @@ exec_kilp(struct tgsi_exec_machine *mach,
mach->Temps[TEMP_KILMASK_I].xyzw[TEMP_KILMASK_C].u[0] |= kilmask;
}
+/**
+ * Execute NVIDIA-style KIL which is predicated by a condition code.
+ * Kill fragment if the condition code is TRUE.
+ */
+static void
+exec_kilp(struct tgsi_exec_machine *mach,
+ const struct tgsi_full_instruction *inst)
+{
+ uint kilmask = 0; /* bit 0 = pixel 0, bit 1 = pixel 1, etc */
+
+ /* TODO: build kilmask from CC mask */
+
+ mach->Temps[TEMP_KILMASK_I].xyzw[TEMP_KILMASK_C].u[0] |= kilmask;
+}
+
/*
* Fetch a texel using STR texture coordinates.
@@ -1963,8 +1986,7 @@ exec_instruction(
break;
case TGSI_OPCODE_KIL:
- /* for enabled ExecMask bits, set the killed bit */
- mach->Temps[TEMP_KILMASK_I].xyzw[TEMP_KILMASK_C].u[0] |= mach->ExecMask;
+ exec_kil (mach, inst);
break;
case TGSI_OPCODE_PK2H:
diff --git a/src/gallium/auxiliary/tgsi/tgsi_sse2.c b/src/gallium/auxiliary/tgsi/tgsi_sse2.c
index 0cb1f11ef2..47dc06faf6 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_sse2.c
+++ b/src/gallium/auxiliary/tgsi/tgsi_sse2.c
@@ -1096,6 +1096,15 @@ emit_kil(
x86_make_reg( file_REG32, reg_AX ) );
}
+
+static void
+emit_kilp(
+ struct x86_function *func )
+{
+ /* XXX todo / fix me */
+}
+
+
static void
emit_setcc(
struct x86_function *func,
@@ -1609,7 +1618,14 @@ emit_instruction(
return 0;
break;
+ case TGSI_OPCODE_KILP:
+ /* predicated kill */
+ emit_kilp( func );
+ return 0; /* XXX fix me */
+ break;
+
case TGSI_OPCODE_KIL:
+ /* conditional kill */
emit_kil( func, &inst->FullSrcRegisters[0] );
break;
diff --git a/src/gallium/auxiliary/util/p_debug.c b/src/gallium/auxiliary/util/p_debug.c
index 082b0e9fb5..2c2f2f8931 100644
--- a/src/gallium/auxiliary/util/p_debug.c
+++ b/src/gallium/auxiliary/util/p_debug.c
@@ -324,7 +324,11 @@ void _debug_assert_fail(const char *expr,
const char *function)
{
_debug_printf("%s:%u:%s: Assertion `%s' failed.\n", file, line, function, expr);
+#if defined(PIPE_OS_WINDOWS)
+ if (debug_get_bool_option("GALLIUM_ABORT_ON_ASSERT", FALSE))
+#else
if (debug_get_bool_option("GALLIUM_ABORT_ON_ASSERT", TRUE))
+#endif
debug_break();
else
_debug_printf("continuing...\n");
diff --git a/src/gallium/auxiliary/util/u_string.h b/src/gallium/auxiliary/util/u_string.h
index abc3232b49..08c89bbf77 100644
--- a/src/gallium/auxiliary/util/u_string.h
+++ b/src/gallium/auxiliary/util/u_string.h
@@ -28,14 +28,14 @@
/**
* @file
* Platform independent functions for string manipulation.
- *
+ *
* @author Jose Fonseca <jrfonseca@tungstengraphics.com>
*/
#ifndef U_STRING_H_
#define U_STRING_H_
-#ifndef WIN32
+#if !defined(WIN32) && !defined(XF86_LIBC_H)
#include <stdio.h>
#endif
#include <stddef.h>
@@ -48,19 +48,19 @@
extern "C" {
#endif
-
+
#ifdef WIN32
-
+
int util_vsnprintf(char *, size_t, const char *, va_list);
int util_snprintf(char *str, size_t size, const char *format, ...);
-static INLINE void
+static INLINE void
util_vsprintf(char *str, const char *format, va_list ap)
{
util_vsnprintf(str, (size_t)-1, format, ap);
}
-static INLINE void
+static INLINE void
util_sprintf(char *str, const char *format, ...)
{
va_list ap;
diff --git a/src/gallium/drivers/cell/spu/spu_exec.c b/src/gallium/drivers/cell/spu/spu_exec.c
index 96393732ed..42e5022f30 100644
--- a/src/gallium/drivers/cell/spu/spu_exec.c
+++ b/src/gallium/drivers/cell/spu/spu_exec.c
@@ -603,8 +603,8 @@ store_dest(
* Kill fragment if any of the four values is less than zero.
*/
static void
-exec_kilp(struct spu_exec_machine *mach,
- const struct tgsi_full_instruction *inst)
+exec_kil(struct spu_exec_machine *mach,
+ const struct tgsi_full_instruction *inst)
{
uint uniquemask;
uint chan_index;
@@ -640,6 +640,20 @@ exec_kilp(struct spu_exec_machine *mach,
mach->Temps[TEMP_KILMASK_I].xyzw[TEMP_KILMASK_C].u[0] |= kilmask;
}
+/**
+ * Execute NVIDIA-style KIL which is predicated by a condition code.
+ * Kill fragment if the condition code is TRUE.
+ */
+static void
+exec_kilp(struct tgsi_exec_machine *mach,
+ const struct tgsi_full_instruction *inst)
+{
+ uint kilmask = 0; /* bit 0 = pixel 0, bit 1 = pixel 1, etc */
+
+ /* TODO: build kilmask from CC mask */
+
+ mach->Temps[TEMP_KILMASK_I].xyzw[TEMP_KILMASK_C].u[0] |= kilmask;
+}
/*
* Fetch a texel using STR texture coordinates.
@@ -1336,8 +1350,7 @@ exec_instruction(
break;
case TGSI_OPCODE_KIL:
- /* for enabled ExecMask bits, set the killed bit */
- mach->Temps[TEMP_KILMASK_I].xyzw[TEMP_KILMASK_C].u[0] |= mach->ExecMask;
+ exec_kil (mach, inst);
break;
case TGSI_OPCODE_PK2H:
diff --git a/src/gallium/drivers/i915simple/i915_fpc_translate.c b/src/gallium/drivers/i915simple/i915_fpc_translate.c
index 04507ab8ad..64432982c4 100644
--- a/src/gallium/drivers/i915simple/i915_fpc_translate.c
+++ b/src/gallium/drivers/i915simple/i915_fpc_translate.c
@@ -560,18 +560,6 @@ i915_translate_instruction(struct i915_fp_compile *p,
break;
case TGSI_OPCODE_KIL:
- /* unconditional kill */
- assert(0); /* not tested yet */
-#if 0
- src0 = src_vector(p, &inst->FullSrcRegisters[0]);
- tmp = i915_get_utemp(p);
-
- i915_emit_texld(p, tmp, A0_DEST_CHANNEL_ALL, /* use a dummy dest reg */
- 0, src0, T0_TEXKILL);
-#endif
- break;
-
- case TGSI_OPCODE_KILP:
/* kill if src[0].x < 0 || src[0].y < 0 ... */
src0 = src_vector(p, &inst->FullSrcRegisters[0]);
tmp = i915_get_utemp(p);
@@ -584,6 +572,10 @@ i915_translate_instruction(struct i915_fp_compile *p,
T0_TEXKILL); /* opcode */
break;
+ case TGSI_OPCODE_KILP:
+ assert(0); /* not tested yet */
+ break;
+
case TGSI_OPCODE_LG2:
src0 = src_vector(p, &inst->FullSrcRegisters[0]);
diff --git a/src/gallium/drivers/softpipe/sp_setup.c b/src/gallium/drivers/softpipe/sp_setup.c
index b48eec730b..b7f2f16307 100644
--- a/src/gallium/drivers/softpipe/sp_setup.c
+++ b/src/gallium/drivers/softpipe/sp_setup.c
@@ -39,6 +39,7 @@
#include "sp_quad.h"
#include "sp_state.h"
#include "sp_prim_setup.h"
+#include "draw/draw_context.h"
#include "draw/draw_private.h"
#include "draw/draw_vertex.h"
#include "pipe/p_util.h"
@@ -1272,10 +1273,7 @@ void setup_prepare( struct setup_context *setup )
}
/* Note: nr_attrs is only used for debugging (vertex printing) */
- {
- const struct sp_fragment_shader *fs = setup->softpipe->fs;
- setup->quad.nr_attrs = fs->info.num_inputs + 1; /* +1 for vert pos */
- }
+ setup->quad.nr_attrs = draw_num_vs_outputs(sp->draw);
sp->quad.first->begin(sp->quad.first);
diff --git a/src/gallium/drivers/trace/tr_context.c b/src/gallium/drivers/trace/tr_context.c
index 47a217ec7c..f82126370c 100644
--- a/src/gallium/drivers/trace/tr_context.c
+++ b/src/gallium/drivers/trace/tr_context.c
@@ -40,8 +40,7 @@ trace_context_set_edgeflags(struct pipe_context *_pipe,
const unsigned *bitfield)
{
struct trace_context *tr_ctx = trace_context(_pipe);
- struct trace_screen *tr_scr = trace_screen(_pipe->screen);
- struct trace_stream *stream = tr_scr->stream;
+ struct trace_stream *stream = tr_ctx->stream;
struct pipe_context *pipe = tr_ctx->pipe;
trace_dump_call_begin(stream, "pipe_context", "set_edgeflags");
@@ -61,8 +60,7 @@ trace_context_draw_arrays(struct pipe_context *_pipe,
unsigned mode, unsigned start, unsigned count)
{
struct trace_context *tr_ctx = trace_context(_pipe);
- struct trace_screen *tr_scr = trace_screen(_pipe->screen);
- struct trace_stream *stream = tr_scr->stream;
+ struct trace_stream *stream = tr_ctx->stream;
struct pipe_context *pipe = tr_ctx->pipe;
boolean result;
@@ -90,8 +88,7 @@ trace_context_draw_elements(struct pipe_context *_pipe,
unsigned mode, unsigned start, unsigned count)
{
struct trace_context *tr_ctx = trace_context(_pipe);
- struct trace_screen *tr_scr = trace_screen(_pipe->screen);
- struct trace_stream *stream = tr_scr->stream;
+ struct trace_stream *stream = tr_ctx->stream;
struct pipe_context *pipe = tr_ctx->pipe;
boolean result;
@@ -125,8 +122,7 @@ trace_context_draw_range_elements(struct pipe_context *_pipe,
unsigned count)
{
struct trace_context *tr_ctx = trace_context(_pipe);
- struct trace_screen *tr_scr = trace_screen(_pipe->screen);
- struct trace_stream *stream = tr_scr->stream;
+ struct trace_stream *stream = tr_ctx->stream;
struct pipe_context *pipe = tr_ctx->pipe;
boolean result;
@@ -159,8 +155,7 @@ trace_context_create_query(struct pipe_context *_pipe,
unsigned query_type)
{
struct trace_context *tr_ctx = trace_context(_pipe);
- struct trace_screen *tr_scr = trace_screen(_pipe->screen);
- struct trace_stream *stream = tr_scr->stream;
+ struct trace_stream *stream = tr_ctx->stream;
struct pipe_context *pipe = tr_ctx->pipe;
struct pipe_query *result;
@@ -184,8 +179,7 @@ trace_context_destroy_query(struct pipe_context *_pipe,
struct pipe_query *query)
{
struct trace_context *tr_ctx = trace_context(_pipe);
- struct trace_screen *tr_scr = trace_screen(_pipe->screen);
- struct trace_stream *stream = tr_scr->stream;
+ struct trace_stream *stream = tr_ctx->stream;
struct pipe_context *pipe = tr_ctx->pipe;
trace_dump_call_begin(stream, "pipe_context", "destroy_query");
@@ -204,8 +198,7 @@ trace_context_begin_query(struct pipe_context *_pipe,
struct pipe_query *query)
{
struct trace_context *tr_ctx = trace_context(_pipe);
- struct trace_screen *tr_scr = trace_screen(_pipe->screen);
- struct trace_stream *stream = tr_scr->stream;
+ struct trace_stream *stream = tr_ctx->stream;
struct pipe_context *pipe = tr_ctx->pipe;
trace_dump_call_begin(stream, "pipe_context", "begin_query");
@@ -224,8 +217,7 @@ trace_context_end_query(struct pipe_context *_pipe,
struct pipe_query *query)
{
struct trace_context *tr_ctx = trace_context(_pipe);
- struct trace_screen *tr_scr = trace_screen(_pipe->screen);
- struct trace_stream *stream = tr_scr->stream;
+ struct trace_stream *stream = tr_ctx->stream;
struct pipe_context *pipe = tr_ctx->pipe;
trace_dump_call_begin(stream, "pipe_context", "end_query");
@@ -246,8 +238,7 @@ trace_context_get_query_result(struct pipe_context *_pipe,
uint64 *presult)
{
struct trace_context *tr_ctx = trace_context(_pipe);
- struct trace_screen *tr_scr = trace_screen(_pipe->screen);
- struct trace_stream *stream = tr_scr->stream;
+ struct trace_stream *stream = tr_ctx->stream;
struct pipe_context *pipe = tr_ctx->pipe;
uint64 result;
boolean _result;
@@ -273,8 +264,7 @@ trace_context_create_blend_state(struct pipe_context *_pipe,
const struct pipe_blend_state *state)
{
struct trace_context *tr_ctx = trace_context(_pipe);
- struct trace_screen *tr_scr = trace_screen(_pipe->screen);
- struct trace_stream *stream = tr_scr->stream;
+ struct trace_stream *stream = tr_ctx->stream;
struct pipe_context *pipe = tr_ctx->pipe;
void * result;
@@ -285,6 +275,8 @@ trace_context_create_blend_state(struct pipe_context *_pipe,
result = pipe->create_blend_state(pipe, state);;
+ trace_dump_ret(stream, ptr, result);
+
trace_dump_call_end(stream);
return result;
@@ -296,8 +288,7 @@ trace_context_bind_blend_state(struct pipe_context *_pipe,
void *state)
{
struct trace_context *tr_ctx = trace_context(_pipe);
- struct trace_screen *tr_scr = trace_screen(_pipe->screen);
- struct trace_stream *stream = tr_scr->stream;
+ struct trace_stream *stream = tr_ctx->stream;
struct pipe_context *pipe = tr_ctx->pipe;
trace_dump_call_begin(stream, "pipe_context", "bind_blend_state");
@@ -316,8 +307,7 @@ trace_context_delete_blend_state(struct pipe_context *_pipe,
void *state)
{
struct trace_context *tr_ctx = trace_context(_pipe);
- struct trace_screen *tr_scr = trace_screen(_pipe->screen);
- struct trace_stream *stream = tr_scr->stream;
+ struct trace_stream *stream = tr_ctx->stream;
struct pipe_context *pipe = tr_ctx->pipe;
trace_dump_call_begin(stream, "pipe_context", "delete_blend_state");
@@ -336,8 +326,7 @@ trace_context_create_sampler_state(struct pipe_context *_pipe,
const struct pipe_sampler_state *state)
{
struct trace_context *tr_ctx = trace_context(_pipe);
- struct trace_screen *tr_scr = trace_screen(_pipe->screen);
- struct trace_stream *stream = tr_scr->stream;
+ struct trace_stream *stream = tr_ctx->stream;
struct pipe_context *pipe = tr_ctx->pipe;
void * result;
@@ -361,8 +350,7 @@ trace_context_bind_sampler_states(struct pipe_context *_pipe,
unsigned num_states, void **states)
{
struct trace_context *tr_ctx = trace_context(_pipe);
- struct trace_screen *tr_scr = trace_screen(_pipe->screen);
- struct trace_stream *stream = tr_scr->stream;
+ struct trace_stream *stream = tr_ctx->stream;
struct pipe_context *pipe = tr_ctx->pipe;
trace_dump_call_begin(stream, "pipe_context", "bind_sampler_states");
@@ -382,8 +370,7 @@ trace_context_delete_sampler_state(struct pipe_context *_pipe,
void *state)
{
struct trace_context *tr_ctx = trace_context(_pipe);
- struct trace_screen *tr_scr = trace_screen(_pipe->screen);
- struct trace_stream *stream = tr_scr->stream;
+ struct trace_stream *stream = tr_ctx->stream;
struct pipe_context *pipe = tr_ctx->pipe;
trace_dump_call_begin(stream, "pipe_context", "delete_sampler_state");
@@ -402,8 +389,7 @@ trace_context_create_rasterizer_state(struct pipe_context *_pipe,
const struct pipe_rasterizer_state *state)
{
struct trace_context *tr_ctx = trace_context(_pipe);
- struct trace_screen *tr_scr = trace_screen(_pipe->screen);
- struct trace_stream *stream = tr_scr->stream;
+ struct trace_stream *stream = tr_ctx->stream;
struct pipe_context *pipe = tr_ctx->pipe;
void * result;
@@ -427,8 +413,7 @@ trace_context_bind_rasterizer_state(struct pipe_context *_pipe,
void *state)
{
struct trace_context *tr_ctx = trace_context(_pipe);
- struct trace_screen *tr_scr = trace_screen(_pipe->screen);
- struct trace_stream *stream = tr_scr->stream;
+ struct trace_stream *stream = tr_ctx->stream;
struct pipe_context *pipe = tr_ctx->pipe;
trace_dump_call_begin(stream, "pipe_context", "bind_rasterizer_state");
@@ -447,8 +432,7 @@ trace_context_delete_rasterizer_state(struct pipe_context *_pipe,
void *state)
{
struct trace_context *tr_ctx = trace_context(_pipe);
- struct trace_screen *tr_scr = trace_screen(_pipe->screen);
- struct trace_stream *stream = tr_scr->stream;
+ struct trace_stream *stream = tr_ctx->stream;
struct pipe_context *pipe = tr_ctx->pipe;
trace_dump_call_begin(stream, "pipe_context", "delete_rasterizer_state");
@@ -467,8 +451,7 @@ trace_context_create_depth_stencil_alpha_state(struct pipe_context *_pipe,
const struct pipe_depth_stencil_alpha_state *state)
{
struct trace_context *tr_ctx = trace_context(_pipe);
- struct trace_screen *tr_scr = trace_screen(_pipe->screen);
- struct trace_stream *stream = tr_scr->stream;
+ struct trace_stream *stream = tr_ctx->stream;
struct pipe_context *pipe = tr_ctx->pipe;
void * result;
@@ -476,8 +459,10 @@ trace_context_create_depth_stencil_alpha_state(struct pipe_context *_pipe,
result = pipe->create_depth_stencil_alpha_state(pipe, state);;
- trace_dump_ret(stream, ptr, result);
+ trace_dump_arg(stream, ptr, pipe);
trace_dump_arg(stream, depth_stencil_alpha_state, state);
+
+ trace_dump_ret(stream, ptr, result);
trace_dump_call_end(stream);
@@ -490,8 +475,7 @@ trace_context_bind_depth_stencil_alpha_state(struct pipe_context *_pipe,
void *state)
{
struct trace_context *tr_ctx = trace_context(_pipe);
- struct trace_screen *tr_scr = trace_screen(_pipe->screen);
- struct trace_stream *stream = tr_scr->stream;
+ struct trace_stream *stream = tr_ctx->stream;
struct pipe_context *pipe = tr_ctx->pipe;
trace_dump_call_begin(stream, "pipe_context", "bind_depth_stencil_alpha_state");
@@ -510,8 +494,7 @@ trace_context_delete_depth_stencil_alpha_state(struct pipe_context *_pipe,
void *state)
{
struct trace_context *tr_ctx = trace_context(_pipe);
- struct trace_screen *tr_scr = trace_screen(_pipe->screen);
- struct trace_stream *stream = tr_scr->stream;
+ struct trace_stream *stream = tr_ctx->stream;
struct pipe_context *pipe = tr_ctx->pipe;
trace_dump_call_begin(stream, "pipe_context", "delete_depth_stencil_alpha_state");
@@ -530,8 +513,7 @@ trace_context_create_fs_state(struct pipe_context *_pipe,
const struct pipe_shader_state *state)
{
struct trace_context *tr_ctx = trace_context(_pipe);
- struct trace_screen *tr_scr = trace_screen(_pipe->screen);
- struct trace_stream *stream = tr_scr->stream;
+ struct trace_stream *stream = tr_ctx->stream;
struct pipe_context *pipe = tr_ctx->pipe;
void * result;
@@ -555,8 +537,7 @@ trace_context_bind_fs_state(struct pipe_context *_pipe,
void *state)
{
struct trace_context *tr_ctx = trace_context(_pipe);
- struct trace_screen *tr_scr = trace_screen(_pipe->screen);
- struct trace_stream *stream = tr_scr->stream;
+ struct trace_stream *stream = tr_ctx->stream;
struct pipe_context *pipe = tr_ctx->pipe;
trace_dump_call_begin(stream, "pipe_context", "bind_fs_state");
@@ -575,8 +556,7 @@ trace_context_delete_fs_state(struct pipe_context *_pipe,
void *state)
{
struct trace_context *tr_ctx = trace_context(_pipe);
- struct trace_screen *tr_scr = trace_screen(_pipe->screen);
- struct trace_stream *stream = tr_scr->stream;
+ struct trace_stream *stream = tr_ctx->stream;
struct pipe_context *pipe = tr_ctx->pipe;
trace_dump_call_begin(stream, "pipe_context", "delete_fs_state");
@@ -595,8 +575,7 @@ trace_context_create_vs_state(struct pipe_context *_pipe,
const struct pipe_shader_state *state)
{
struct trace_context *tr_ctx = trace_context(_pipe);
- struct trace_screen *tr_scr = trace_screen(_pipe->screen);
- struct trace_stream *stream = tr_scr->stream;
+ struct trace_stream *stream = tr_ctx->stream;
struct pipe_context *pipe = tr_ctx->pipe;
void * result;
@@ -620,8 +599,7 @@ trace_context_bind_vs_state(struct pipe_context *_pipe,
void *state)
{
struct trace_context *tr_ctx = trace_context(_pipe);
- struct trace_screen *tr_scr = trace_screen(_pipe->screen);
- struct trace_stream *stream = tr_scr->stream;
+ struct trace_stream *stream = tr_ctx->stream;
struct pipe_context *pipe = tr_ctx->pipe;
trace_dump_call_begin(stream, "pipe_context", "bind_vs_state");
@@ -640,8 +618,7 @@ trace_context_delete_vs_state(struct pipe_context *_pipe,
void *state)
{
struct trace_context *tr_ctx = trace_context(_pipe);
- struct trace_screen *tr_scr = trace_screen(_pipe->screen);
- struct trace_stream *stream = tr_scr->stream;
+ struct trace_stream *stream = tr_ctx->stream;
struct pipe_context *pipe = tr_ctx->pipe;
trace_dump_call_begin(stream, "pipe_context", "delete_vs_state");
@@ -660,8 +637,7 @@ trace_context_set_blend_color(struct pipe_context *_pipe,
const struct pipe_blend_color *state)
{
struct trace_context *tr_ctx = trace_context(_pipe);
- struct trace_screen *tr_scr = trace_screen(_pipe->screen);
- struct trace_stream *stream = tr_scr->stream;
+ struct trace_stream *stream = tr_ctx->stream;
struct pipe_context *pipe = tr_ctx->pipe;
trace_dump_call_begin(stream, "pipe_context", "set_blend_color");
@@ -680,8 +656,7 @@ trace_context_set_clip_state(struct pipe_context *_pipe,
const struct pipe_clip_state *state)
{
struct trace_context *tr_ctx = trace_context(_pipe);
- struct trace_screen *tr_scr = trace_screen(_pipe->screen);
- struct trace_stream *stream = tr_scr->stream;
+ struct trace_stream *stream = tr_ctx->stream;
struct pipe_context *pipe = tr_ctx->pipe;
trace_dump_call_begin(stream, "pipe_context", "set_clip_state");
@@ -701,8 +676,7 @@ trace_context_set_constant_buffer(struct pipe_context *_pipe,
const struct pipe_constant_buffer *buffer)
{
struct trace_context *tr_ctx = trace_context(_pipe);
- struct trace_screen *tr_scr = trace_screen(_pipe->screen);
- struct trace_stream *stream = tr_scr->stream;
+ struct trace_stream *stream = tr_ctx->stream;
struct pipe_context *pipe = tr_ctx->pipe;
trace_dump_call_begin(stream, "pipe_context", "set_constant_buffer");
@@ -723,8 +697,7 @@ trace_context_set_framebuffer_state(struct pipe_context *_pipe,
const struct pipe_framebuffer_state *state)
{
struct trace_context *tr_ctx = trace_context(_pipe);
- struct trace_screen *tr_scr = trace_screen(_pipe->screen);
- struct trace_stream *stream = tr_scr->stream;
+ struct trace_stream *stream = tr_ctx->stream;
struct pipe_context *pipe = tr_ctx->pipe;
trace_dump_call_begin(stream, "pipe_context", "set_framebuffer_state");
@@ -743,8 +716,7 @@ trace_context_set_polygon_stipple(struct pipe_context *_pipe,
const struct pipe_poly_stipple *state)
{
struct trace_context *tr_ctx = trace_context(_pipe);
- struct trace_screen *tr_scr = trace_screen(_pipe->screen);
- struct trace_stream *stream = tr_scr->stream;
+ struct trace_stream *stream = tr_ctx->stream;
struct pipe_context *pipe = tr_ctx->pipe;
trace_dump_call_begin(stream, "pipe_context", "set_polygon_stipple");
@@ -763,8 +735,7 @@ trace_context_set_scissor_state(struct pipe_context *_pipe,
const struct pipe_scissor_state *state)
{
struct trace_context *tr_ctx = trace_context(_pipe);
- struct trace_screen *tr_scr = trace_screen(_pipe->screen);
- struct trace_stream *stream = tr_scr->stream;
+ struct trace_stream *stream = tr_ctx->stream;
struct pipe_context *pipe = tr_ctx->pipe;
trace_dump_call_begin(stream, "pipe_context", "set_scissor_state");
@@ -783,8 +754,7 @@ trace_context_set_viewport_state(struct pipe_context *_pipe,
const struct pipe_viewport_state *state)
{
struct trace_context *tr_ctx = trace_context(_pipe);
- struct trace_screen *tr_scr = trace_screen(_pipe->screen);
- struct trace_stream *stream = tr_scr->stream;
+ struct trace_stream *stream = tr_ctx->stream;
struct pipe_context *pipe = tr_ctx->pipe;
trace_dump_call_begin(stream, "pipe_context", "set_viewport_state");
@@ -804,8 +774,7 @@ trace_context_set_sampler_textures(struct pipe_context *_pipe,
struct pipe_texture **textures)
{
struct trace_context *tr_ctx = trace_context(_pipe);
- struct trace_screen *tr_scr = trace_screen(_pipe->screen);
- struct trace_stream *stream = tr_scr->stream;
+ struct trace_stream *stream = tr_ctx->stream;
struct pipe_context *pipe = tr_ctx->pipe;
trace_dump_call_begin(stream, "pipe_context", "set_sampler_textures");
@@ -826,8 +795,7 @@ trace_context_set_vertex_buffers(struct pipe_context *_pipe,
const struct pipe_vertex_buffer *buffers)
{
struct trace_context *tr_ctx = trace_context(_pipe);
- struct trace_screen *tr_scr = trace_screen(_pipe->screen);
- struct trace_stream *stream = tr_scr->stream;
+ struct trace_stream *stream = tr_ctx->stream;
struct pipe_context *pipe = tr_ctx->pipe;
trace_dump_call_begin(stream, "pipe_context", "set_vertex_buffers");
@@ -851,15 +819,13 @@ trace_context_set_vertex_elements(struct pipe_context *_pipe,
const struct pipe_vertex_element *elements)
{
struct trace_context *tr_ctx = trace_context(_pipe);
- struct trace_screen *tr_scr = trace_screen(_pipe->screen);
- struct trace_stream *stream = tr_scr->stream;
+ struct trace_stream *stream = tr_ctx->stream;
struct pipe_context *pipe = tr_ctx->pipe;
trace_dump_call_begin(stream, "pipe_context", "set_vertex_elements");
trace_dump_arg(stream, ptr, pipe);
trace_dump_arg(stream, uint, num_elements);
- trace_dump_arg(stream, ptr, elements);
trace_dump_arg_begin(stream, "elements");
trace_dump_struct_array(stream, vertex_element, elements, num_elements);
@@ -881,8 +847,7 @@ trace_context_surface_copy(struct pipe_context *_pipe,
unsigned width, unsigned height)
{
struct trace_context *tr_ctx = trace_context(_pipe);
- struct trace_screen *tr_scr = trace_screen(_pipe->screen);
- struct trace_stream *stream = tr_scr->stream;
+ struct trace_stream *stream = tr_ctx->stream;
struct pipe_context *pipe = tr_ctx->pipe;
trace_dump_call_begin(stream, "pipe_context", "surface_copy");
@@ -914,8 +879,7 @@ trace_context_surface_fill(struct pipe_context *_pipe,
unsigned value)
{
struct trace_context *tr_ctx = trace_context(_pipe);
- struct trace_screen *tr_scr = trace_screen(_pipe->screen);
- struct trace_stream *stream = tr_scr->stream;
+ struct trace_stream *stream = tr_ctx->stream;
struct pipe_context *pipe = tr_ctx->pipe;
trace_dump_call_begin(stream, "pipe_context", "surface_fill");
@@ -939,8 +903,7 @@ trace_context_clear(struct pipe_context *_pipe,
unsigned clearValue)
{
struct trace_context *tr_ctx = trace_context(_pipe);
- struct trace_screen *tr_scr = trace_screen(_pipe->screen);
- struct trace_stream *stream = tr_scr->stream;
+ struct trace_stream *stream = tr_ctx->stream;
struct pipe_context *pipe = tr_ctx->pipe;
trace_dump_call_begin(stream, "pipe_context", "clear");
@@ -961,8 +924,7 @@ trace_context_flush(struct pipe_context *_pipe,
struct pipe_fence_handle **fence)
{
struct trace_context *tr_ctx = trace_context(_pipe);
- struct trace_screen *tr_scr = trace_screen(_pipe->screen);
- struct trace_stream *stream = tr_scr->stream;
+ struct trace_stream *stream = tr_ctx->stream;
struct pipe_context *pipe = tr_ctx->pipe;
trace_dump_call_begin(stream, "pipe_context", "flush");
@@ -981,8 +943,7 @@ static INLINE void
trace_context_destroy(struct pipe_context *_pipe)
{
struct trace_context *tr_ctx = trace_context(_pipe);
- struct trace_screen *tr_scr = trace_screen(_pipe->screen);
- struct trace_stream *stream = tr_scr->stream;
+ struct trace_stream *stream = tr_ctx->stream;
struct pipe_context *pipe = tr_ctx->pipe;
trace_dump_call_begin(stream, "pipe_context", "destroy");
@@ -1000,6 +961,7 @@ trace_context_destroy(struct pipe_context *_pipe)
struct pipe_context *
trace_context_create(struct pipe_context *pipe)
{
+ struct trace_stream *stream;
struct trace_context *tr_ctx;
if(!debug_get_bool_option("GALLIUM_TRACE", FALSE))
@@ -1055,10 +1017,18 @@ trace_context_create(struct pipe_context *pipe)
tr_ctx->base.flush = trace_context_flush;
tr_ctx->pipe = pipe;
+ tr_ctx->stream = stream = trace_winsys(pipe->winsys)->stream;
/* We don't want to trace the internal pipe calls */
pipe->winsys = trace_winsys(pipe->winsys)->winsys;
pipe->screen = trace_screen(pipe->screen)->screen;
+ trace_dump_call_begin(stream, "", "pipe_context_create");
+ trace_dump_arg_begin(stream, "screen");
+ trace_dump_ptr(stream, pipe->screen);
+ trace_dump_arg_end(stream);
+ trace_dump_ret(stream, ptr, pipe);
+ trace_dump_call_end(stream);
+
return &tr_ctx->base;
}
diff --git a/src/gallium/drivers/trace/tr_context.h b/src/gallium/drivers/trace/tr_context.h
index 80fb5980d6..2c0b0c72e4 100644
--- a/src/gallium/drivers/trace/tr_context.h
+++ b/src/gallium/drivers/trace/tr_context.h
@@ -34,11 +34,16 @@
#include "pipe/p_context.h"
+struct trace_stream;
+
+
struct trace_context
{
struct pipe_context base;
struct pipe_context *pipe;
+
+ struct trace_stream *stream;
};
diff --git a/src/gallium/drivers/trace/tr_dump.c b/src/gallium/drivers/trace/tr_dump.c
index f545de30f4..5269c4ddc8 100644
--- a/src/gallium/drivers/trace/tr_dump.c
+++ b/src/gallium/drivers/trace/tr_dump.c
@@ -276,17 +276,16 @@ void trace_dump_bytes(struct trace_stream *stream,
const void *data,
long unsigned size)
{
- static char hex_table[] = "0123456789ABCDE";
+ static const char hex_table[16] = "0123456789ABCDEF";
const uint8_t *p = data;
long unsigned i;
trace_dump_write(stream, "<bytes>");
for(i = 0; i < size; ++i) {
uint8_t byte = *p++;
- char str[3];
- str[0] = hex_table[byte >> 4];
- str[1] = hex_table[byte & 0xf];
- str[2] = 0;
- trace_dump_write(stream, str);
+ char hex[2];
+ hex[0] = hex_table[byte >> 4];
+ hex[1] = hex_table[byte & 0xf];
+ trace_stream_write(stream, hex, 2);
}
trace_dump_write(stream, "</bytes>");
}
diff --git a/src/gallium/drivers/trace/tr_screen.c b/src/gallium/drivers/trace/tr_screen.c
index de885abae2..27c218039e 100644
--- a/src/gallium/drivers/trace/tr_screen.c
+++ b/src/gallium/drivers/trace/tr_screen.c
@@ -346,6 +346,7 @@ trace_screen_destroy(struct pipe_screen *_screen)
struct pipe_screen *
trace_screen_create(struct pipe_screen *screen)
{
+ struct trace_stream *stream;
struct trace_screen *tr_scr;
if(!debug_get_bool_option("GALLIUM_TRACE", FALSE))
@@ -371,13 +372,17 @@ trace_screen_create(struct pipe_screen *screen)
tr_scr->base.surface_unmap = trace_screen_surface_unmap;
tr_scr->screen = screen;
-
- tr_scr->stream = trace_winsys(screen->winsys)->stream;
- if(!tr_scr->stream)
- return NULL;
+ tr_scr->stream = stream = trace_winsys(screen->winsys)->stream;
/* We don't want to trace the internal pipe calls */
screen->winsys = trace_winsys(screen->winsys)->winsys;
+ trace_dump_call_begin(stream, "", "pipe_screen_create");
+ trace_dump_arg_begin(stream, "winsys");
+ trace_dump_ptr(stream, screen->winsys);
+ trace_dump_arg_end(stream);
+ trace_dump_ret(stream, ptr, screen);
+ trace_dump_call_end(stream);
+
return &tr_scr->base;
}
diff --git a/src/gallium/drivers/trace/tr_state.c b/src/gallium/drivers/trace/tr_state.c
index 9ffe77146d..e074ae7abc 100644
--- a/src/gallium/drivers/trace/tr_state.c
+++ b/src/gallium/drivers/trace/tr_state.c
@@ -73,6 +73,10 @@ void trace_dump_template(struct trace_stream *stream,
trace_dump_array(stream, uint, templat->height, 1);
trace_dump_member_end(stream);
+ trace_dump_member_begin(stream, "depth");
+ trace_dump_array(stream, uint, templat->depth, 1);
+ trace_dump_member_end(stream);
+
trace_dump_member_begin(stream, "block");
trace_dump_block(stream, &templat->block);
trace_dump_member_end(stream);
@@ -146,9 +150,10 @@ void trace_dump_poly_stipple(struct trace_stream *stream,
trace_dump_struct_begin(stream, "pipe_poly_stipple");
trace_dump_member_begin(stream, "stipple");
- trace_dump_bytes(stream,
+ trace_dump_array(stream,
+ uint,
state->stipple,
- sizeof(state->stipple));
+ Elements(state->stipple));
trace_dump_member_end(stream);
trace_dump_struct_end(stream);
@@ -273,7 +278,7 @@ void trace_dump_depth_stencil_alpha_state(struct trace_stream *stream,
trace_dump_struct_begin(stream, "pipe_depth_stencil_alpha_state");
trace_dump_member_begin(stream, "depth");
- trace_dump_struct_begin(stream, "");
+ trace_dump_struct_begin(stream, "pipe_depth_state");
trace_dump_member(stream, bool, &state->depth, enabled);
trace_dump_member(stream, bool, &state->depth, writemask);
trace_dump_member(stream, uint, &state->depth, func);
@@ -285,7 +290,7 @@ void trace_dump_depth_stencil_alpha_state(struct trace_stream *stream,
trace_dump_array_begin(stream);
for(i = 0; i < Elements(state->stencil); ++i) {
trace_dump_elem_begin(stream);
- trace_dump_struct_begin(stream, "");
+ trace_dump_struct_begin(stream, "pipe_stencil_state");
trace_dump_member(stream, bool, &state->stencil[i], enabled);
trace_dump_member(stream, uint, &state->stencil[i], func);
trace_dump_member(stream, uint, &state->stencil[i], fail_op);
@@ -301,7 +306,7 @@ void trace_dump_depth_stencil_alpha_state(struct trace_stream *stream,
trace_dump_member_end(stream);
trace_dump_member_begin(stream, "alpha");
- trace_dump_struct_begin(stream, "");
+ trace_dump_struct_begin(stream, "pipe_alpha_state");
trace_dump_member(stream, bool, &state->alpha, enabled);
trace_dump_member(stream, uint, &state->alpha, func);
trace_dump_member(stream, float, &state->alpha, ref);
diff --git a/src/gallium/drivers/trace/tr_winsys.c b/src/gallium/drivers/trace/tr_winsys.c
index 964da5677b..eec84a1981 100644
--- a/src/gallium/drivers/trace/tr_winsys.c
+++ b/src/gallium/drivers/trace/tr_winsys.c
@@ -26,6 +26,7 @@
**************************************************************************/
#include "pipe/p_util.h"
+#include "pipe/p_state.h"
#include "util/u_hash_table.h"
#include "tr_stream.h"
@@ -178,7 +179,7 @@ trace_winsys_buffer_create(struct pipe_winsys *_winsys,
struct trace_winsys *tr_ws = trace_winsys(_winsys);
struct trace_stream *stream = tr_ws->stream;
struct pipe_winsys *winsys = tr_ws->winsys;
- struct pipe_buffer *result;
+ struct pipe_buffer *buffer;
trace_dump_call_begin(stream, "pipe_winsys", "buffer_create");
@@ -187,13 +188,23 @@ trace_winsys_buffer_create(struct pipe_winsys *_winsys,
trace_dump_arg(stream, uint, usage);
trace_dump_arg(stream, uint, size);
- result = winsys->buffer_create(winsys, alignment, usage, size);
+ buffer = winsys->buffer_create(winsys, alignment, usage, size);
- trace_dump_ret(stream, ptr, result);
+ trace_dump_ret(stream, ptr, buffer);
trace_dump_call_end(stream);
+
+ /* Zero the buffer to avoid dumping uninitialized memory */
+ if(buffer->usage & PIPE_BUFFER_USAGE_CPU_WRITE) {
+ void *map;
+ map = winsys->buffer_map(winsys, buffer, PIPE_BUFFER_USAGE_CPU_WRITE);
+ if(map) {
+ memset(map, 0, buffer->size);
+ winsys->buffer_unmap(winsys, buffer);
+ }
+ }
- return result;
+ return buffer;
}
@@ -229,30 +240,18 @@ trace_winsys_buffer_map(struct pipe_winsys *_winsys,
unsigned usage)
{
struct trace_winsys *tr_ws = trace_winsys(_winsys);
- struct trace_stream *stream = tr_ws->stream;
struct pipe_winsys *winsys = tr_ws->winsys;
- void *result;
-
- trace_dump_call_begin(stream, "pipe_winsys", "buffer_map");
+ void *map;
- trace_dump_arg(stream, ptr, winsys);
- trace_dump_arg(stream, ptr, buffer);
- trace_dump_arg(stream, uint, usage);
-
- result = winsys->buffer_map(winsys, buffer, usage);
-
- trace_dump_ret(stream, ptr, result);
-
- trace_dump_call_end(stream);
-
- if(result) {
+ map = winsys->buffer_map(winsys, buffer, usage);
+ if(map) {
if(usage & PIPE_BUFFER_USAGE_CPU_WRITE) {
assert(!hash_table_get(tr_ws->buffer_maps, buffer));
- hash_table_set(tr_ws->buffer_maps, buffer, result);
+ hash_table_set(tr_ws->buffer_maps, buffer, map);
}
}
- return result;
+ return map;
}
@@ -267,13 +266,13 @@ trace_winsys_buffer_unmap(struct pipe_winsys *_winsys,
map = hash_table_get(tr_ws->buffer_maps, buffer);
if(map) {
- trace_dump_call_begin(stream, "", "memcpy");
+ trace_dump_call_begin(stream, "pipe_winsys", "buffer_write");
- trace_dump_arg_begin(stream, "dst");
- trace_dump_ptr(stream, map);
- trace_dump_arg_end(stream);
+ trace_dump_arg(stream, ptr, winsys);
- trace_dump_arg_begin(stream, "src");
+ trace_dump_arg(stream, ptr, buffer);
+
+ trace_dump_arg_begin(stream, "data");
trace_dump_bytes(stream, map, buffer->size);
trace_dump_arg_end(stream);
@@ -283,19 +282,10 @@ trace_winsys_buffer_unmap(struct pipe_winsys *_winsys,
trace_dump_call_end(stream);
- winsys->buffer_unmap(winsys, buffer);
-
hash_table_remove(tr_ws->buffer_maps, buffer);
}
- trace_dump_call_begin(stream, "pipe_winsys", "buffer_unmap");
-
- trace_dump_arg(stream, ptr, winsys);
- trace_dump_arg(stream, ptr, buffer);
-
winsys->buffer_unmap(winsys, buffer);
-
- trace_dump_call_end(stream);
}
@@ -420,6 +410,7 @@ trace_winsys_destroy(struct pipe_winsys *_winsys)
struct pipe_winsys *
trace_winsys_create(struct pipe_winsys *winsys)
{
+ struct trace_stream *stream;
struct trace_winsys *tr_ws;
if(!debug_get_bool_option("GALLIUM_TRACE", FALSE))
@@ -446,7 +437,7 @@ trace_winsys_create(struct pipe_winsys *winsys)
tr_ws->winsys = winsys;
- tr_ws->stream = trace_stream_create("gallium", "trace");
+ tr_ws->stream = stream = trace_stream_create("gallium", "trace");
if(!tr_ws->stream)
return NULL;
@@ -455,8 +446,11 @@ trace_winsys_create(struct pipe_winsys *winsys)
if(!tr_ws->buffer_maps)
return NULL;
-
trace_dump_trace_begin(tr_ws->stream, 0);
+ trace_dump_call_begin(stream, "", "pipe_winsys_create");
+ trace_dump_ret(stream, ptr, winsys);
+ trace_dump_call_end(stream);
+
return &tr_ws->base;
}
diff --git a/src/gallium/include/pipe/p_compiler.h b/src/gallium/include/pipe/p_compiler.h
index 2afb8464c7..4d64c74a4a 100644
--- a/src/gallium/include/pipe/p_compiler.h
+++ b/src/gallium/include/pipe/p_compiler.h
@@ -31,8 +31,13 @@
#include "p_config.h"
+#ifndef XFree86Server
#include <stdlib.h>
#include <string.h>
+#else
+#include "xf86_ansic.h"
+#include "xf86_libc.h"
+#endif
#if defined(_WIN32) && !defined(__WIN32__)
diff --git a/src/gallium/include/pipe/p_shader_tokens.h b/src/gallium/include/pipe/p_shader_tokens.h
index ed931d24b9..3ab0c7deaf 100644
--- a/src/gallium/include/pipe/p_shader_tokens.h
+++ b/src/gallium/include/pipe/p_shader_tokens.h
@@ -240,6 +240,7 @@ struct tgsi_immediate_float32
* GL_ARB_fragment_program
*/
#define TGSI_OPCODE_CMP 66
+#define TGSI_OPCODE_KIL 116 /* conditional kill */
#define TGSI_OPCODE_SCS 67
#define TGSI_OPCODE_TXB 68
@@ -327,7 +328,7 @@ struct tgsi_immediate_float32
/*
* ps_1_1
*/
-#define TGSI_OPCODE_TEXKILL TGSI_OPCODE_KILP
+#define TGSI_OPCODE_TEXKILL TGSI_OPCODE_KIL
/*
* ps_1_2
@@ -386,7 +387,6 @@ struct tgsi_immediate_float32
* vs_2_x
*/
-#define TGSI_OPCODE_KIL 116 /* unpredicated kill */
#define TGSI_OPCODE_END 117 /* aka HALT */
#define TGSI_OPCODE_LAST 119
diff --git a/src/gallium/include/pipe/p_state.h b/src/gallium/include/pipe/p_state.h
index 2401305eb7..4d0f3597e6 100644
--- a/src/gallium/include/pipe/p_state.h
+++ b/src/gallium/include/pipe/p_state.h
@@ -170,29 +170,38 @@ struct pipe_shader_state
};
+struct pipe_depth_state {
+ unsigned enabled:1; /**< depth test enabled? */
+ unsigned writemask:1; /**< allow depth buffer writes? */
+ unsigned func:3; /**< depth test func (PIPE_FUNC_x) */
+ unsigned occlusion_count:1; /**< do occlusion counting? */
+};
+
+
+struct pipe_stencil_state {
+ unsigned enabled:1; /**< stencil[0]: stencil enabled, stencil[1]: two-side enabled */
+ unsigned func:3; /**< PIPE_FUNC_x */
+ unsigned fail_op:3; /**< PIPE_STENCIL_OP_x */
+ unsigned zpass_op:3; /**< PIPE_STENCIL_OP_x */
+ unsigned zfail_op:3; /**< PIPE_STENCIL_OP_x */
+ ubyte ref_value;
+ ubyte value_mask;
+ ubyte write_mask;
+};
+
+
+struct pipe_alpha_state {
+ unsigned enabled:1;
+ unsigned func:3; /**< PIPE_FUNC_x */
+ float ref; /**< reference value */
+};
+
+
struct pipe_depth_stencil_alpha_state
{
- struct {
- unsigned enabled:1; /**< depth test enabled? */
- unsigned writemask:1; /**< allow depth buffer writes? */
- unsigned func:3; /**< depth test func (PIPE_FUNC_x) */
- unsigned occlusion_count:1; /**< do occlusion counting? */
- } depth;
- struct {
- unsigned enabled:1; /**< stencil[0]: stencil enabled, stencil[1]: two-side enabled */
- unsigned func:3; /**< PIPE_FUNC_x */
- unsigned fail_op:3; /**< PIPE_STENCIL_OP_x */
- unsigned zpass_op:3; /**< PIPE_STENCIL_OP_x */
- unsigned zfail_op:3; /**< PIPE_STENCIL_OP_x */
- ubyte ref_value;
- ubyte value_mask;
- ubyte write_mask;
- } stencil[2]; /**< [0] = front, [1] = back */
- struct {
- unsigned enabled:1;
- unsigned func:3; /**< PIPE_FUNC_x */
- float ref; /**< reference value */
- } alpha;
+ struct pipe_depth_state depth;
+ struct pipe_stencil_state stencil[2]; /**< [0] = front, [1] = back */
+ struct pipe_alpha_state alpha;
};
diff --git a/src/gallium/state_trackers/python/README b/src/gallium/state_trackers/python/README
index 75341aa28c..8ab88ab2f8 100644
--- a/src/gallium/state_trackers/python/README
+++ b/src/gallium/state_trackers/python/README
@@ -7,7 +7,7 @@ To build you'll need:
* Python (with development packages)
* SCons
* SWIG
-* Python Imaging Library (for the samples)
+* Python Imaging Library with TK support (for the samples)
Invoke scons on the top dir as
@@ -19,9 +19,9 @@ To use do
and then try running
- python src/gallium/state_trackers/python/samples/simple.py
+ python src/gallium/state_trackers/python/samples/tri.py
-which should create a simple.png
+which should show a triangle.
This is still in experimental phase, and there many limitations to what you can
diff --git a/src/gallium/state_trackers/python/gallium.i b/src/gallium/state_trackers/python/gallium.i
index 284ecb827d..8d7a49cee7 100644
--- a/src/gallium/state_trackers/python/gallium.i
+++ b/src/gallium/state_trackers/python/gallium.i
@@ -58,6 +58,7 @@
%include "carrays.i"
%array_class(unsigned char, ByteArray);
%array_class(int, IntArray);
+%array_class(unsigned, UnsignedArray);
%array_class(float, FloatArray);
@@ -65,13 +66,15 @@
%rename(Context) st_context;
%rename(Texture) pipe_texture;
%rename(Surface) pipe_surface;
-
-%rename(Buffer) pipe_buffer;
+%rename(Buffer) st_buffer;
%rename(BlendColor) pipe_blend_color;
%rename(Blend) pipe_blend_state;
%rename(Clip) pipe_clip_state;
%rename(ConstantBuffer) pipe_constant_buffer;
+%rename(Depth) pipe_depth_state;
+%rename(Stencil) pipe_stencil_state;
+%rename(Alpha) pipe_alpha_state;
%rename(DepthStencilAlpha) pipe_depth_stencil_alpha_state;
%rename(FormatBlock) pipe_format_block;
%rename(Framebuffer) pipe_framebuffer_state;
@@ -84,505 +87,13 @@
%rename(VertexElement) pipe_vertex_element;
%rename(Viewport) pipe_viewport_state;
-%nodefaultctor st_device;
-%nodefaultctor st_context;
-%nodefaultctor pipe_texture;
-%nodefaultctor pipe_surface;
-%nodefaultctor pipe_buffer;
-
-%nodefaultdtor st_device;
-%nodefaultdtor st_context;
-%nodefaultdtor pipe_texture;
-%nodefaultdtor pipe_surface;
-%nodefaultdtor pipe_buffer;
-
-%ignore pipe_texture::screen;
-
-%ignore pipe_surface::winsys;
-%immutable pipe_surface::texture;
-%immutable pipe_surface::buffer;
-%include "p_format.i";
+%include "p_compiler.i"
%include "pipe/p_defines.h";
-%include "pipe/p_state.h";
-%include "pipe/p_shader_tokens.h";
-
-
-struct st_device {
-};
-
-struct st_context {
-};
-
-
-%newobject st_device::texture_create;
-%newobject st_device::context_create;
-%newobject st_device::buffer_create;
-
-%extend st_device {
-
- st_device(int hardware = 1) {
- return st_device_create(hardware ? TRUE : FALSE);
- }
-
- ~st_device() {
- st_device_destroy($self);
- }
-
- const char * get_name( void ) {
- return $self->screen->get_name($self->screen);
- }
-
- const char * get_vendor( void ) {
- return $self->screen->get_vendor($self->screen);
- }
-
- /**
- * Query an integer-valued capability/parameter/limit
- * \param param one of PIPE_CAP_x
- */
- int get_param( int param ) {
- return $self->screen->get_param($self->screen, param);
- }
-
- /**
- * Query a float-valued capability/parameter/limit
- * \param param one of PIPE_CAP_x
- */
- float get_paramf( int param ) {
- return $self->screen->get_paramf($self->screen, param);
- }
-
- /**
- * Check if the given pipe_format is supported as a texture or
- * drawing surface.
- * \param type one of PIPE_TEXTURE, PIPE_SURFACE
- */
- int is_format_supported( enum pipe_format format,
- enum pipe_texture_target target,
- unsigned tex_usage,
- unsigned geom_flags ) {
- return $self->screen->is_format_supported( $self->screen,
- format,
- target,
- tex_usage,
- geom_flags );
- }
-
- struct st_context *
- context_create(void) {
- return st_context_create($self);
- }
-
- struct pipe_texture *
- texture_create(
- enum pipe_format format,
- unsigned width,
- unsigned height,
- unsigned depth = 1,
- unsigned last_level = 0,
- enum pipe_texture_target target = PIPE_TEXTURE_2D,
- unsigned tex_usage = 0
- ) {
- struct pipe_texture templat;
- memset(&templat, 0, sizeof(templat));
- templat.format = format;
- pf_get_block(templat.format, &templat.block);
- templat.width[0] = width;
- templat.height[0] = height;
- templat.depth[0] = depth;
- templat.last_level = last_level;
- templat.target = target;
- templat.tex_usage = tex_usage;
- return $self->screen->texture_create($self->screen, &templat);
- }
-
- struct pipe_buffer *
- buffer_create(unsigned size, unsigned alignment = 0, unsigned usage = 0) {
- return $self->screen->winsys->buffer_create($self->screen->winsys, alignment, usage, size);
- }
-
-};
-
-
-%extend st_context {
-
- ~st_context() {
- st_context_destroy($self);
- }
-
- /*
- * State functions (create/bind/destroy state objects)
- */
-
- void set_blend( const struct pipe_blend_state *state ) {
- cso_set_blend($self->cso, state);
- }
-
- void set_sampler( unsigned index, const struct pipe_sampler_state *state ) {
- cso_single_sampler($self->cso, index, state);
- cso_single_sampler_done($self->cso);
- }
-
- void set_rasterizer( const struct pipe_rasterizer_state *state ) {
- cso_set_rasterizer($self->cso, state);
- }
-
- void set_depth_stencil_alpha(const struct pipe_depth_stencil_alpha_state *state) {
- cso_set_depth_stencil_alpha($self->cso, state);
- }
-
- void set_fragment_shader( const struct pipe_shader_state *state ) {
- void *fs;
-
- fs = $self->pipe->create_fs_state($self->pipe, state);
- if(!fs)
- return;
-
- if(cso_set_fragment_shader_handle($self->cso, fs) != PIPE_OK)
- return;
-
- cso_delete_fragment_shader($self->cso, $self->fs);
- $self->fs = fs;
- }
-
- void set_vertex_shader( const struct pipe_shader_state *state ) {
- void *vs;
-
- vs = $self->pipe->create_vs_state($self->pipe, state);
- if(!vs)
- return;
-
- if(cso_set_vertex_shader_handle($self->cso, vs) != PIPE_OK)
- return;
-
- cso_delete_vertex_shader($self->cso, $self->vs);
- $self->vs = vs;
- }
-
- /*
- * Parameter-like state (or properties)
- */
-
- void set_blend_color(const struct pipe_blend_color *state ) {
- cso_set_blend_color($self->cso, state);
- }
-
- void set_clip(const struct pipe_clip_state *state ) {
- $self->pipe->set_clip_state($self->pipe, state);
- }
-
- void set_constant_buffer(unsigned shader, unsigned index,
- const struct pipe_constant_buffer *buf ) {
- $self->pipe->set_constant_buffer($self->pipe, shader, index, buf);
- }
-
- void set_framebuffer(const struct pipe_framebuffer_state *state ) {
- cso_set_framebuffer($self->cso, state);
- }
-
- void set_polygon_stipple(const struct pipe_poly_stipple *state ) {
- $self->pipe->set_polygon_stipple($self->pipe, state);
- }
-
- void set_scissor(const struct pipe_scissor_state *state ) {
- $self->pipe->set_scissor_state($self->pipe, state);
- }
-
- void set_viewport(const struct pipe_viewport_state *state) {
- cso_set_viewport($self->cso, state);
- }
-
- void set_sampler_texture(unsigned index,
- struct pipe_texture *texture) {
- if(!texture)
- texture = $self->default_texture;
- pipe_texture_reference(&$self->sampler_textures[index], texture);
- $self->pipe->set_sampler_textures($self->pipe,
- PIPE_MAX_SAMPLERS,
- $self->sampler_textures);
- }
-
- void set_vertex_buffer(unsigned index,
- const struct pipe_vertex_buffer *buffer) {
- memcpy(&$self->vertex_buffers[index], buffer, sizeof(*buffer));
- $self->pipe->set_vertex_buffers($self->pipe, PIPE_MAX_ATTRIBS, $self->vertex_buffers);
- }
-
- void set_vertex_element(unsigned index,
- const struct pipe_vertex_element *element) {
- memcpy(&$self->vertex_elements[index], element, sizeof(*element));
- $self->pipe->set_vertex_elements($self->pipe, PIPE_MAX_ATTRIBS, $self->vertex_elements);
- }
-
- /*
- * Draw functions
- */
-
- void draw_arrays(unsigned mode, unsigned start, unsigned count) {
- $self->pipe->draw_arrays($self->pipe, mode, start, count);
- }
-
- void draw_elements( struct pipe_buffer *indexBuffer,
- unsigned indexSize,
- unsigned mode, unsigned start, unsigned count) {
- $self->pipe->draw_elements($self->pipe, indexBuffer, indexSize, mode, start, count);
- }
-
- void draw_vertices(unsigned prim,
- unsigned num_verts,
- unsigned num_attribs,
- const float *vertices)
- {
- struct pipe_context *pipe = $self->pipe;
- struct pipe_winsys *winsys = pipe->winsys;
- struct pipe_buffer *vbuf;
- float *map;
- unsigned size;
-
- size = num_verts * num_attribs * 4 * sizeof(float);
-
- vbuf = winsys->buffer_create(winsys,
- 32,
- PIPE_BUFFER_USAGE_VERTEX,
- size);
- if(!vbuf)
- goto error1;
-
- map = winsys->buffer_map(winsys, vbuf, PIPE_BUFFER_USAGE_CPU_WRITE);
- if (!map)
- goto error2;
- memcpy(map, vertices, size);
- pipe->winsys->buffer_unmap(pipe->winsys, vbuf);
-
- util_draw_vertex_buffer(pipe, vbuf, prim, num_verts, num_attribs);
-
-error2:
- pipe_buffer_reference(pipe->winsys, &vbuf, NULL);
-error1:
- ;
- }
-
- void
- flush(void) {
- struct pipe_fence_handle *fence = NULL;
- $self->pipe->flush($self->pipe, PIPE_FLUSH_RENDER_CACHE, &fence);
- /* TODO: allow asynchronous operation */
- $self->pipe->winsys->fence_finish( $self->pipe->winsys, fence, 0 );
- $self->pipe->winsys->fence_reference( $self->pipe->winsys, &fence, NULL );
- }
-
- /*
- * Surface functions
- */
-
- void surface_copy(int do_flip,
- struct pipe_surface *dest,
- unsigned destx, unsigned desty,
- struct pipe_surface *src,
- unsigned srcx, unsigned srcy,
- unsigned width, unsigned height) {
- $self->pipe->surface_copy($self->pipe, do_flip, dest, destx, desty, src, srcx, srcy, width, height);
- }
-
- void surface_fill(struct pipe_surface *dst,
- unsigned x, unsigned y,
- unsigned width, unsigned height,
- unsigned value) {
- $self->pipe->surface_fill($self->pipe, dst, x, y, width, height, value);
- }
-
- void surface_clear(struct pipe_surface *surface, unsigned value = 0) {
- $self->pipe->clear($self->pipe, surface, value);
- }
-
-};
-
-
-%newobject pipe_texture::get_surface;
-
-%extend pipe_texture {
-
- ~pipe_texture() {
- struct pipe_texture *ptr = $self;
- pipe_texture_reference(&ptr, NULL);
- }
-
- unsigned get_width(unsigned level=0) {
- return $self->width[level];
- }
-
- unsigned get_height(unsigned level=0) {
- return $self->height[level];
- }
-
- unsigned get_depth(unsigned level=0) {
- return $self->depth[level];
- }
-
- unsigned get_nblocksx(unsigned level=0) {
- return $self->nblocksx[level];
- }
-
- unsigned get_nblocksy(unsigned level=0) {
- return $self->nblocksy[level];
- }
-
- /** Get a surface which is a "view" into a texture */
- struct pipe_surface *
- get_surface(unsigned face=0, unsigned level=0, unsigned zslice=0, unsigned usage=0 )
- {
- struct pipe_screen *screen = $self->screen;
- return screen->get_tex_surface(screen, $self, face, level, zslice, usage);
- }
-
-};
-
-
-%extend pipe_surface {
-
- ~pipe_surface() {
- struct pipe_surface *ptr = $self;
- pipe_surface_reference(&ptr, NULL);
- }
-
- // gets mapped to pipe_surface_map automatically
- void * map( unsigned flags );
-
- // gets mapped to pipe_surface_unmap automatically
- void unmap( void );
-
- void
- get_tile_raw(unsigned x, unsigned y, unsigned w, unsigned h, unsigned char *raw, unsigned stride) {
- pipe_get_tile_raw($self, x, y, w, h, raw, stride);
- }
-
- void
- put_tile_raw(unsigned x, unsigned y, unsigned w, unsigned h, const unsigned char *raw, unsigned stride) {
- pipe_put_tile_raw($self, x, y, w, h, raw, stride);
- }
-
- void
- get_tile_rgba(unsigned x, unsigned y, unsigned w, unsigned h, float *rgba) {
- pipe_get_tile_rgba($self, x, y, w, h, rgba);
- }
-
- void
- put_tile_rgba(unsigned x, unsigned y, unsigned w, unsigned h, const float *rgba) {
- pipe_put_tile_rgba($self, x, y, w, h, rgba);
- }
-
- void
- get_tile_z(unsigned x, unsigned y, unsigned w, unsigned h, unsigned *z) {
- pipe_get_tile_z($self, x, y, w, h, z);
- }
-
- void
- put_tile_z(unsigned x, unsigned y, unsigned w, unsigned h, const unsigned *z) {
- pipe_put_tile_z($self, x, y, w, h, z);
- }
-
- void
- sample_rgba(float *rgba) {
- st_sample_surface($self, rgba);
- }
-
- unsigned
- compare_tile_rgba(unsigned x, unsigned y, unsigned w, unsigned h, const float *rgba, float tol = 0.0)
- {
- float *rgba2;
- const float *p1;
- const float *p2;
- unsigned i, j, n;
-
- rgba2 = MALLOC(h*w*4*sizeof(float));
- if(!rgba2)
- return ~0;
-
- pipe_get_tile_rgba($self, x, y, w, h, rgba2);
-
- p1 = rgba;
- p2 = rgba2;
- n = 0;
- for(i = h*w; i; --i) {
- unsigned differs = 0;
- for(j = 4; j; --j) {
- float delta = *p2++ - *p1++;
- if (delta < -tol || delta > tol)
- differs = 1;
- }
- n += differs;
- }
-
- FREE(rgba2);
-
- return n;
- }
-
-};
-
-
-%extend pipe_framebuffer_state {
-
- pipe_framebuffer_state(void) {
- return CALLOC_STRUCT(pipe_framebuffer_state);
- }
-
- ~pipe_framebuffer_state() {
- unsigned index;
- for(index = 0; index < PIPE_MAX_COLOR_BUFS; ++index)
- pipe_surface_reference(&$self->cbufs[index], NULL);
- pipe_surface_reference(&$self->zsbuf, NULL);
- FREE($self);
- }
-
- void
- set_cbuf(unsigned index, struct pipe_surface *surface) {
- pipe_surface_reference(&$self->cbufs[index], surface);
- }
-
- void
- set_zsbuf(struct pipe_surface *surface) {
- pipe_surface_reference(&$self->zsbuf, surface);
- }
-
-};
-
+%include "p_format.i"
-%extend pipe_shader_state {
-
- pipe_shader_state(const char *text, unsigned num_tokens = 1024) {
- struct tgsi_token *tokens;
- struct pipe_shader_state *shader;
-
- tokens = MALLOC(num_tokens * sizeof(struct tgsi_token));
- if(!tokens)
- goto error1;
-
- if(tgsi_text_translate(text, tokens, num_tokens ) != TRUE)
- goto error2;
-
- shader = CALLOC_STRUCT(pipe_shader_state);
- if(!shader)
- goto error3;
-
- shader->tokens = tokens;
-
- return shader;
-
-error3:
-error2:
- FREE(tokens);
-error1:
- return NULL;
- }
-
- ~pipe_shader_state() {
- FREE((void*)$self->tokens);
- FREE($self);
- }
+%include "p_device.i"
+%include "p_context.i"
+%include "p_texture.i"
+%include "p_state.i"
- void dump(unsigned flags = 0) {
- tgsi_dump($self->tokens, flags);
- }
-} \ No newline at end of file
diff --git a/src/gallium/state_trackers/python/p_compiler.i b/src/gallium/state_trackers/python/p_compiler.i
new file mode 100644
index 0000000000..15f6ba5b9d
--- /dev/null
+++ b/src/gallium/state_trackers/python/p_compiler.i
@@ -0,0 +1,29 @@
+ /**************************************************************************
+ *
+ * Copyright 2008 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.
+ *
+ **************************************************************************/
+
+
+typedef unsigned char ubyte;
diff --git a/src/gallium/state_trackers/python/p_context.i b/src/gallium/state_trackers/python/p_context.i
new file mode 100644
index 0000000000..521a2dee07
--- /dev/null
+++ b/src/gallium/state_trackers/python/p_context.i
@@ -0,0 +1,257 @@
+ /**************************************************************************
+ *
+ * Copyright 2008 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.
+ *
+ **************************************************************************/
+
+/**
+ * @file
+ * SWIG interface definion for Gallium types.
+ *
+ * @author Jose Fonseca <jrfonseca@tungstengraphics.com>
+ */
+
+%nodefaultctor st_context;
+%nodefaultdtor st_context;
+
+struct st_context {
+};
+
+%extend st_context {
+
+ ~st_context() {
+ st_context_destroy($self);
+ }
+
+ /*
+ * State functions (create/bind/destroy state objects)
+ */
+
+ void set_blend( const struct pipe_blend_state *state ) {
+ cso_set_blend($self->cso, state);
+ }
+
+ void set_sampler( unsigned index, const struct pipe_sampler_state *state ) {
+ cso_single_sampler($self->cso, index, state);
+ cso_single_sampler_done($self->cso);
+ }
+
+ void set_rasterizer( const struct pipe_rasterizer_state *state ) {
+ cso_set_rasterizer($self->cso, state);
+ }
+
+ void set_depth_stencil_alpha(const struct pipe_depth_stencil_alpha_state *state) {
+ cso_set_depth_stencil_alpha($self->cso, state);
+ }
+
+ void set_fragment_shader( const struct pipe_shader_state *state ) {
+ void *fs;
+
+ fs = $self->pipe->create_fs_state($self->pipe, state);
+ if(!fs)
+ return;
+
+ if(cso_set_fragment_shader_handle($self->cso, fs) != PIPE_OK)
+ return;
+
+ cso_delete_fragment_shader($self->cso, $self->fs);
+ $self->fs = fs;
+ }
+
+ void set_vertex_shader( const struct pipe_shader_state *state ) {
+ void *vs;
+
+ vs = $self->pipe->create_vs_state($self->pipe, state);
+ if(!vs)
+ return;
+
+ if(cso_set_vertex_shader_handle($self->cso, vs) != PIPE_OK)
+ return;
+
+ cso_delete_vertex_shader($self->cso, $self->vs);
+ $self->vs = vs;
+ }
+
+ /*
+ * Parameter-like state (or properties)
+ */
+
+ void set_blend_color(const struct pipe_blend_color *state ) {
+ cso_set_blend_color($self->cso, state);
+ }
+
+ void set_clip(const struct pipe_clip_state *state ) {
+ $self->pipe->set_clip_state($self->pipe, state);
+ }
+
+ void set_constant_buffer(unsigned shader, unsigned index,
+ struct st_buffer *buffer )
+ {
+ struct pipe_constant_buffer state;
+ memset(&state, 0, sizeof(state));
+ state.buffer = buffer->buffer;
+ state.size = buffer->buffer->size;
+ $self->pipe->set_constant_buffer($self->pipe, shader, index, &state);
+ }
+
+ void set_framebuffer(const struct pipe_framebuffer_state *state ) {
+ cso_set_framebuffer($self->cso, state);
+ }
+
+ void set_polygon_stipple(const struct pipe_poly_stipple *state ) {
+ $self->pipe->set_polygon_stipple($self->pipe, state);
+ }
+
+ void set_scissor(const struct pipe_scissor_state *state ) {
+ $self->pipe->set_scissor_state($self->pipe, state);
+ }
+
+ void set_viewport(const struct pipe_viewport_state *state) {
+ cso_set_viewport($self->cso, state);
+ }
+
+ void set_sampler_texture(unsigned index,
+ struct pipe_texture *texture) {
+ if(!texture)
+ texture = $self->default_texture;
+ pipe_texture_reference(&$self->sampler_textures[index], texture);
+ $self->pipe->set_sampler_textures($self->pipe,
+ PIPE_MAX_SAMPLERS,
+ $self->sampler_textures);
+ }
+
+ void set_vertex_buffer(unsigned index,
+ unsigned pitch,
+ unsigned max_index,
+ unsigned buffer_offset,
+ struct st_buffer *buffer)
+ {
+ unsigned i, num_vertex_buffers;
+ struct pipe_vertex_buffer state;
+
+ memset(&state, 0, sizeof(state));
+ state.pitch = pitch;
+ state.max_index = max_index;
+ state.buffer_offset = buffer_offset;
+ state.buffer = buffer->buffer;
+
+ memcpy(&$self->vertex_buffers[index], &state, sizeof(state));
+
+ for(i = 0; i < PIPE_MAX_ATTRIBS; ++i)
+ if(self->vertex_buffers[i].buffer)
+ num_vertex_buffers = i + 1;
+
+ $self->pipe->set_vertex_buffers($self->pipe,
+ num_vertex_buffers,
+ $self->vertex_buffers);
+ }
+
+ void set_vertex_element(unsigned index,
+ const struct pipe_vertex_element *element) {
+ memcpy(&$self->vertex_elements[index], element, sizeof(*element));
+ $self->pipe->set_vertex_elements($self->pipe, PIPE_MAX_ATTRIBS, $self->vertex_elements);
+ }
+
+ /*
+ * Draw functions
+ */
+
+ void draw_arrays(unsigned mode, unsigned start, unsigned count) {
+ $self->pipe->draw_arrays($self->pipe, mode, start, count);
+ }
+
+ void draw_elements( struct st_buffer *indexBuffer,
+ unsigned indexSize,
+ unsigned mode, unsigned start, unsigned count) {
+ $self->pipe->draw_elements($self->pipe, indexBuffer->buffer, indexSize, mode, start, count);
+ }
+
+ void draw_vertices(unsigned prim,
+ unsigned num_verts,
+ unsigned num_attribs,
+ const float *vertices)
+ {
+ struct pipe_context *pipe = $self->pipe;
+ struct pipe_winsys *winsys = pipe->winsys;
+ struct pipe_buffer *vbuf;
+ float *map;
+ unsigned size;
+
+ size = num_verts * num_attribs * 4 * sizeof(float);
+
+ vbuf = winsys->buffer_create(winsys,
+ 32,
+ PIPE_BUFFER_USAGE_VERTEX,
+ size);
+ if(!vbuf)
+ goto error1;
+
+ map = winsys->buffer_map(winsys, vbuf, PIPE_BUFFER_USAGE_CPU_WRITE);
+ if (!map)
+ goto error2;
+ memcpy(map, vertices, size);
+ pipe->winsys->buffer_unmap(pipe->winsys, vbuf);
+
+ util_draw_vertex_buffer(pipe, vbuf, prim, num_verts, num_attribs);
+
+error2:
+ pipe_buffer_reference(pipe->winsys, &vbuf, NULL);
+error1:
+ ;
+ }
+
+ void
+ flush(void) {
+ struct pipe_fence_handle *fence = NULL;
+ $self->pipe->flush($self->pipe, PIPE_FLUSH_RENDER_CACHE, &fence);
+ /* TODO: allow asynchronous operation */
+ $self->pipe->winsys->fence_finish( $self->pipe->winsys, fence, 0 );
+ $self->pipe->winsys->fence_reference( $self->pipe->winsys, &fence, NULL );
+ }
+
+ /*
+ * Surface functions
+ */
+
+ void surface_copy(int do_flip,
+ struct pipe_surface *dest,
+ unsigned destx, unsigned desty,
+ struct pipe_surface *src,
+ unsigned srcx, unsigned srcy,
+ unsigned width, unsigned height) {
+ $self->pipe->surface_copy($self->pipe, do_flip, dest, destx, desty, src, srcx, srcy, width, height);
+ }
+
+ void surface_fill(struct pipe_surface *dst,
+ unsigned x, unsigned y,
+ unsigned width, unsigned height,
+ unsigned value) {
+ $self->pipe->surface_fill($self->pipe, dst, x, y, width, height, value);
+ }
+
+ void surface_clear(struct pipe_surface *surface, unsigned value = 0) {
+ $self->pipe->clear($self->pipe, surface, value);
+ }
+
+};
diff --git a/src/gallium/state_trackers/python/p_device.i b/src/gallium/state_trackers/python/p_device.i
new file mode 100644
index 0000000000..84fd2e4349
--- /dev/null
+++ b/src/gallium/state_trackers/python/p_device.i
@@ -0,0 +1,130 @@
+ /**************************************************************************
+ *
+ * Copyright 2008 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.
+ *
+ **************************************************************************/
+
+/**
+ * @file
+ * SWIG interface definion for Gallium types.
+ *
+ * @author Jose Fonseca <jrfonseca@tungstengraphics.com>
+ */
+
+
+%nodefaultctor st_device;
+%nodefaultdtor st_device;
+
+
+struct st_device {
+};
+
+%newobject st_device::texture_create;
+%newobject st_device::context_create;
+%newobject st_device::buffer_create;
+
+%extend st_device {
+
+ st_device(int hardware = 1) {
+ return st_device_create(hardware ? TRUE : FALSE);
+ }
+
+ ~st_device() {
+ st_device_destroy($self);
+ }
+
+ const char * get_name( void ) {
+ return $self->screen->get_name($self->screen);
+ }
+
+ const char * get_vendor( void ) {
+ return $self->screen->get_vendor($self->screen);
+ }
+
+ /**
+ * Query an integer-valued capability/parameter/limit
+ * \param param one of PIPE_CAP_x
+ */
+ int get_param( int param ) {
+ return $self->screen->get_param($self->screen, param);
+ }
+
+ /**
+ * Query a float-valued capability/parameter/limit
+ * \param param one of PIPE_CAP_x
+ */
+ float get_paramf( int param ) {
+ return $self->screen->get_paramf($self->screen, param);
+ }
+
+ /**
+ * Check if the given pipe_format is supported as a texture or
+ * drawing surface.
+ * \param type one of PIPE_TEXTURE, PIPE_SURFACE
+ */
+ int is_format_supported( enum pipe_format format,
+ enum pipe_texture_target target,
+ unsigned tex_usage,
+ unsigned geom_flags ) {
+ return $self->screen->is_format_supported( $self->screen,
+ format,
+ target,
+ tex_usage,
+ geom_flags );
+ }
+
+ struct st_context *
+ context_create(void) {
+ return st_context_create($self);
+ }
+
+ struct pipe_texture *
+ texture_create(
+ enum pipe_format format,
+ unsigned width,
+ unsigned height,
+ unsigned depth = 1,
+ unsigned last_level = 0,
+ enum pipe_texture_target target = PIPE_TEXTURE_2D,
+ unsigned tex_usage = 0
+ ) {
+ struct pipe_texture templat;
+ memset(&templat, 0, sizeof(templat));
+ templat.format = format;
+ pf_get_block(templat.format, &templat.block);
+ templat.width[0] = width;
+ templat.height[0] = height;
+ templat.depth[0] = depth;
+ templat.last_level = last_level;
+ templat.target = target;
+ templat.tex_usage = tex_usage;
+ return $self->screen->texture_create($self->screen, &templat);
+ }
+
+ struct st_buffer *
+ buffer_create(unsigned size, unsigned alignment = 0, unsigned usage = 0) {
+ return st_buffer_create($self, alignment, usage, size);
+ }
+
+};
diff --git a/src/gallium/state_trackers/python/p_state.i b/src/gallium/state_trackers/python/p_state.i
new file mode 100644
index 0000000000..9834229b4b
--- /dev/null
+++ b/src/gallium/state_trackers/python/p_state.i
@@ -0,0 +1,103 @@
+ /**************************************************************************
+ *
+ * Copyright 2008 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.
+ *
+ **************************************************************************/
+
+/**
+ * @file
+ * SWIG interface definion for Gallium types.
+ *
+ * @author Jose Fonseca <jrfonseca@tungstengraphics.com>
+ */
+
+%module gallium;
+
+%include "pipe/p_state.h";
+
+
+%extend pipe_framebuffer_state {
+
+ pipe_framebuffer_state(void) {
+ return CALLOC_STRUCT(pipe_framebuffer_state);
+ }
+
+ ~pipe_framebuffer_state() {
+ unsigned index;
+ for(index = 0; index < PIPE_MAX_COLOR_BUFS; ++index)
+ pipe_surface_reference(&$self->cbufs[index], NULL);
+ pipe_surface_reference(&$self->zsbuf, NULL);
+ FREE($self);
+ }
+
+ void
+ set_cbuf(unsigned index, struct pipe_surface *surface) {
+ pipe_surface_reference(&$self->cbufs[index], surface);
+ }
+
+ void
+ set_zsbuf(struct pipe_surface *surface) {
+ pipe_surface_reference(&$self->zsbuf, surface);
+ }
+
+};
+
+
+%extend pipe_shader_state {
+
+ pipe_shader_state(const char *text, unsigned num_tokens = 1024) {
+ struct tgsi_token *tokens;
+ struct pipe_shader_state *shader;
+
+ tokens = MALLOC(num_tokens * sizeof(struct tgsi_token));
+ if(!tokens)
+ goto error1;
+
+ if(tgsi_text_translate(text, tokens, num_tokens ) != TRUE)
+ goto error2;
+
+ shader = CALLOC_STRUCT(pipe_shader_state);
+ if(!shader)
+ goto error3;
+
+ shader->tokens = tokens;
+
+ return shader;
+
+error3:
+error2:
+ FREE(tokens);
+error1:
+ return NULL;
+ }
+
+ ~pipe_shader_state() {
+ FREE((void*)$self->tokens);
+ FREE($self);
+ }
+
+ void dump(unsigned flags = 0) {
+ tgsi_dump($self->tokens, flags);
+ }
+}
diff --git a/src/gallium/state_trackers/python/p_texture.i b/src/gallium/state_trackers/python/p_texture.i
new file mode 100644
index 0000000000..fd38e0733f
--- /dev/null
+++ b/src/gallium/state_trackers/python/p_texture.i
@@ -0,0 +1,192 @@
+ /**************************************************************************
+ *
+ * Copyright 2008 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.
+ *
+ **************************************************************************/
+
+/**
+ * @file
+ * SWIG interface definion for Gallium types.
+ *
+ * @author Jose Fonseca <jrfonseca@tungstengraphics.com>
+ */
+
+
+%nodefaultctor pipe_texture;
+%nodefaultctor pipe_surface;
+%nodefaultctor st_buffer;
+
+%nodefaultdtor pipe_texture;
+%nodefaultdtor pipe_surface;
+%nodefaultdtor st_buffer;
+
+%ignore pipe_texture::screen;
+
+%ignore pipe_surface::winsys;
+%immutable pipe_surface::texture;
+%immutable pipe_surface::buffer;
+
+%newobject pipe_texture::get_surface;
+
+
+%extend pipe_texture {
+
+ ~pipe_texture() {
+ struct pipe_texture *ptr = $self;
+ pipe_texture_reference(&ptr, NULL);
+ }
+
+ unsigned get_width(unsigned level=0) {
+ return $self->width[level];
+ }
+
+ unsigned get_height(unsigned level=0) {
+ return $self->height[level];
+ }
+
+ unsigned get_depth(unsigned level=0) {
+ return $self->depth[level];
+ }
+
+ unsigned get_nblocksx(unsigned level=0) {
+ return $self->nblocksx[level];
+ }
+
+ unsigned get_nblocksy(unsigned level=0) {
+ return $self->nblocksy[level];
+ }
+
+ /** Get a surface which is a "view" into a texture */
+ struct pipe_surface *
+ get_surface(unsigned face=0, unsigned level=0, unsigned zslice=0, unsigned usage=0 )
+ {
+ struct pipe_screen *screen = $self->screen;
+ return screen->get_tex_surface(screen, $self, face, level, zslice, usage);
+ }
+
+};
+
+
+%extend pipe_surface {
+
+ ~pipe_surface() {
+ struct pipe_surface *ptr = $self;
+ pipe_surface_reference(&ptr, NULL);
+ }
+
+ // gets mapped to pipe_surface_map automatically
+ void * map( unsigned flags );
+
+ // gets mapped to pipe_surface_unmap automatically
+ void unmap( void );
+
+ void
+ get_tile_raw(unsigned x, unsigned y, unsigned w, unsigned h, unsigned char *raw, unsigned stride) {
+ pipe_get_tile_raw($self, x, y, w, h, raw, stride);
+ }
+
+ void
+ put_tile_raw(unsigned x, unsigned y, unsigned w, unsigned h, const unsigned char *raw, unsigned stride) {
+ pipe_put_tile_raw($self, x, y, w, h, raw, stride);
+ }
+
+ void
+ get_tile_rgba(unsigned x, unsigned y, unsigned w, unsigned h, float *rgba) {
+ pipe_get_tile_rgba($self, x, y, w, h, rgba);
+ }
+
+ void
+ put_tile_rgba(unsigned x, unsigned y, unsigned w, unsigned h, const float *rgba) {
+ pipe_put_tile_rgba($self, x, y, w, h, rgba);
+ }
+
+ void
+ get_tile_z(unsigned x, unsigned y, unsigned w, unsigned h, unsigned *z) {
+ pipe_get_tile_z($self, x, y, w, h, z);
+ }
+
+ void
+ put_tile_z(unsigned x, unsigned y, unsigned w, unsigned h, const unsigned *z) {
+ pipe_put_tile_z($self, x, y, w, h, z);
+ }
+
+ void
+ sample_rgba(float *rgba) {
+ st_sample_surface($self, rgba);
+ }
+
+ unsigned
+ compare_tile_rgba(unsigned x, unsigned y, unsigned w, unsigned h, const float *rgba, float tol = 0.0)
+ {
+ float *rgba2;
+ const float *p1;
+ const float *p2;
+ unsigned i, j, n;
+
+ rgba2 = MALLOC(h*w*4*sizeof(float));
+ if(!rgba2)
+ return ~0;
+
+ pipe_get_tile_rgba($self, x, y, w, h, rgba2);
+
+ p1 = rgba;
+ p2 = rgba2;
+ n = 0;
+ for(i = h*w; i; --i) {
+ unsigned differs = 0;
+ for(j = 4; j; --j) {
+ float delta = *p2++ - *p1++;
+ if (delta < -tol || delta > tol)
+ differs = 1;
+ }
+ n += differs;
+ }
+
+ FREE(rgba2);
+
+ return n;
+ }
+
+};
+
+struct st_buffer {
+};
+
+%extend st_buffer {
+
+ ~st_buffer() {
+ st_buffer_destroy($self);
+ }
+
+ void write( const char *STRING, unsigned LENGTH, unsigned offset = 0) {
+ struct pipe_winsys *winsys = $self->st_dev->screen->winsys;
+ char *map;
+
+ map = winsys->buffer_map(winsys, $self->buffer, PIPE_BUFFER_USAGE_CPU_WRITE);
+ if(!map) {
+ memcpy(map + offset, STRING, LENGTH);
+ winsys->buffer_unmap(winsys, $self->buffer);
+ }
+ }
+};
diff --git a/src/gallium/state_trackers/python/st_device.c b/src/gallium/state_trackers/python/st_device.c
index 2e53a83eea..fbd56712e0 100644
--- a/src/gallium/state_trackers/python/st_device.c
+++ b/src/gallium/state_trackers/python/st_device.c
@@ -266,3 +266,36 @@ st_context_create(struct st_device *st_dev)
return st_ctx;
}
+
+
+void
+st_buffer_destroy(struct st_buffer *st_buf)
+{
+ if(st_buf) {
+ struct pipe_winsys *winsys = st_buf->st_dev->screen->winsys;
+ pipe_buffer_reference(winsys, &st_buf->buffer, NULL);
+ FREE(st_buf);
+ }
+}
+
+
+struct st_buffer *
+st_buffer_create(struct st_device *st_dev,
+ unsigned alignment, unsigned usage, unsigned size)
+{
+ struct pipe_winsys *winsys = st_dev->screen->winsys;
+ struct st_buffer *st_buf;
+
+ st_buf = CALLOC_STRUCT(st_buffer);
+ if(!st_buf)
+ return NULL;
+
+ st_buf->st_dev = st_dev;
+
+ st_buf->buffer = winsys->buffer_create(winsys, alignment, usage, size);
+ if(!st_buf->buffer)
+ st_buffer_destroy(st_buf);
+
+ return st_buf;
+}
+
diff --git a/src/gallium/state_trackers/python/st_device.h b/src/gallium/state_trackers/python/st_device.h
index 2d95c2da73..5b7adbe1a0 100644
--- a/src/gallium/state_trackers/python/st_device.h
+++ b/src/gallium/state_trackers/python/st_device.h
@@ -38,6 +38,13 @@ struct pipe_context;
struct st_winsys;
+struct st_buffer {
+ struct st_device *st_dev;
+
+ struct pipe_buffer *buffer;
+};
+
+
struct st_context {
struct st_device *st_dev;
@@ -65,6 +72,13 @@ struct st_device {
};
+struct st_buffer *
+st_buffer_create(struct st_device *st_dev,
+ unsigned alignment, unsigned usage, unsigned size);
+
+void
+st_buffer_destroy(struct st_buffer *st_buf);
+
struct st_context *
st_context_create(struct st_device *st_dev);
diff --git a/src/gallium/winsys/gdi/wgl.c b/src/gallium/winsys/gdi/wgl.c
index 50126014a8..3ce470480d 100644
--- a/src/gallium/winsys/gdi/wgl.c
+++ b/src/gallium/winsys/gdi/wgl.c
@@ -1,5 +1,3 @@
-/* $Id: wgl.c,v 1.12 2006/03/30 07:58:24 kschultz Exp $ */
-
/*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public