projects
/
mesa.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
cell: add support for fragment shader constant buffers
[mesa.git]
/
src
/
gallium
/
drivers
/
cell
/
ppu
/
cell_state_shader.c
diff --git
a/src/gallium/drivers/cell/ppu/cell_state_shader.c
b/src/gallium/drivers/cell/ppu/cell_state_shader.c
index cd96b317faaf086dd8330c22f2a3c1659b3bfd81..54a17eaf2b7692cc3592a596bc619270452c3b40 100644
(file)
--- a/
src/gallium/drivers/cell/ppu/cell_state_shader.c
+++ b/
src/gallium/drivers/cell/ppu/cell_state_shader.c
@@
-34,14
+34,14
@@
#include "cell_context.h"
#include "cell_state.h"
#include "cell_context.h"
#include "cell_state.h"
-
+#include "cell_gen_fp.h"
/** cast wrapper */
static INLINE struct cell_fragment_shader_state *
cell_fragment_shader_state(void *shader)
{
/** cast wrapper */
static INLINE struct cell_fragment_shader_state *
cell_fragment_shader_state(void *shader)
{
- return (struct
pipe
_shader_state *) shader;
+ return (struct
cell_fragment
_shader_state *) shader;
}
}
@@
-49,16
+49,19
@@
cell_fragment_shader_state(void *shader)
static INLINE struct cell_vertex_shader_state *
cell_vertex_shader_state(void *shader)
{
static INLINE struct cell_vertex_shader_state *
cell_vertex_shader_state(void *shader)
{
- return (struct
pipe
_shader_state *) shader;
+ return (struct
cell_vertex
_shader_state *) shader;
}
}
-
+/**
+ * Create fragment shader state.
+ * Called via pipe->create_fs_state()
+ */
static void *
cell_create_fs_state(struct pipe_context *pipe,
const struct pipe_shader_state *templ)
{
static void *
cell_create_fs_state(struct pipe_context *pipe,
const struct pipe_shader_state *templ)
{
- /*struct cell_context *cell = cell_context(pipe);*/
+ struct cell_context *cell = cell_context(pipe);
struct cell_fragment_shader_state *cfs;
cfs = CALLOC_STRUCT(cell_fragment_shader_state);
struct cell_fragment_shader_state *cfs;
cfs = CALLOC_STRUCT(cell_fragment_shader_state);
@@
-73,10
+76,15
@@
cell_create_fs_state(struct pipe_context *pipe,
tgsi_scan_shader(templ->tokens, &cfs->info);
tgsi_scan_shader(templ->tokens, &cfs->info);
+ cell_gen_fragment_program(cell, cfs->shader.tokens, &cfs->code);
+
return cfs;
}
return cfs;
}
+/**
+ * Called via pipe->bind_fs_state()
+ */
static void
cell_bind_fs_state(struct pipe_context *pipe, void *fs)
{
static void
cell_bind_fs_state(struct pipe_context *pipe, void *fs)
{
@@
-88,16
+96,25
@@
cell_bind_fs_state(struct pipe_context *pipe, void *fs)
}
}
+/**
+ * Called via pipe->delete_fs_state()
+ */
static void
cell_delete_fs_state(struct pipe_context *pipe, void *fs)
{
struct cell_fragment_shader_state *cfs = cell_fragment_shader_state(fs);
static void
cell_delete_fs_state(struct pipe_context *pipe, void *fs)
{
struct cell_fragment_shader_state *cfs = cell_fragment_shader_state(fs);
+ spe_release_func(&cfs->code);
+
FREE((void *) cfs->shader.tokens);
FREE(cfs);
}
FREE((void *) cfs->shader.tokens);
FREE(cfs);
}
+/**
+ * Create vertex shader state.
+ * Called via pipe->create_vs_state()
+ */
static void *
cell_create_vs_state(struct pipe_context *pipe,
const struct pipe_shader_state *templ)
static void *
cell_create_vs_state(struct pipe_context *pipe,
const struct pipe_shader_state *templ)
@@
-128,6
+145,9
@@
cell_create_vs_state(struct pipe_context *pipe,
}
}
+/**
+ * Called via pipe->bind_vs_state()
+ */
static void
cell_bind_vs_state(struct pipe_context *pipe, void *vs)
{
static void
cell_bind_vs_state(struct pipe_context *pipe, void *vs)
{
@@
-142,6
+162,9
@@
cell_bind_vs_state(struct pipe_context *pipe, void *vs)
}
}
+/**
+ * Called via pipe->delete_vs_state()
+ */
static void
cell_delete_vs_state(struct pipe_context *pipe, void *vs)
{
static void
cell_delete_vs_state(struct pipe_context *pipe, void *vs)
{
@@
-154,6
+177,9
@@
cell_delete_vs_state(struct pipe_context *pipe, void *vs)
}
}
+/**
+ * Called via pipe->set_constant_buffer()
+ */
static void
cell_set_constant_buffer(struct pipe_context *pipe,
uint shader, uint index,
static void
cell_set_constant_buffer(struct pipe_context *pipe,
uint shader, uint index,
@@
-166,12
+192,15
@@
cell_set_constant_buffer(struct pipe_context *pipe,
assert(index == 0);
/* note: reference counting */
assert(index == 0);
/* note: reference counting */
-
pipe
_buffer_reference(ws,
+
winsys
_buffer_reference(ws,
&cell->constants[shader].buffer,
buf->buffer);
cell->constants[shader].size = buf->size;
&cell->constants[shader].buffer,
buf->buffer);
cell->constants[shader].size = buf->size;
- cell->dirty |= CELL_NEW_CONSTANTS;
+ if (shader == PIPE_SHADER_VERTEX)
+ cell->dirty |= CELL_NEW_VS_CONSTANTS;
+ else if (shader == PIPE_SHADER_FRAGMENT)
+ cell->dirty |= CELL_NEW_FS_CONSTANTS;
}
}