OSDN Git Service

tgsi: initial texturing support on sse path
[android-x86/external-mesa.git] / src / gallium / drivers / softpipe / sp_fs_sse.c
index 0111469..f4fa090 100644 (file)
  * 
  **************************************************************************/
 
+/**
+ * Execute fragment shader using runtime SSE code generation.
+ */
 
 #include "sp_context.h"
 #include "sp_state.h"
 #include "sp_fs.h"
-#include "sp_headers.h"
-
+#include "sp_quad.h"
 
 #include "pipe/p_state.h"
 #include "pipe/p_defines.h"
 #include "util/u_memory.h"
-#include "pipe/p_inlines.h"
 #include "tgsi/tgsi_exec.h"
 #include "tgsi/tgsi_sse2.h"
 
 
-#if defined(PIPE_ARCH_X86) && defined(PIPE_ARCH_SSE)
+#if defined(PIPE_ARCH_X86)
 
 #include "rtasm/rtasm_x86sse.h"
 
-/* Surely this should be defined somewhere in a tgsi header:
+
+
+/**
+ * Subclass of sp_fragment_shader
  */
-typedef void (PIPE_CDECL *codegen_function)(
-   const struct tgsi_exec_vector *input,
-   struct tgsi_exec_vector *output,
-   const float (*constant)[4],
-   struct tgsi_exec_vector *temporary,
-   const struct tgsi_interp_coef *coef,
-   float (*immediates)[4]
-   //, const struct tgsi_exec_vector *quadPos
- );
-
-
-struct sp_sse_fragment_shader {
+struct sp_sse_fragment_shader
+{
    struct sp_fragment_shader base;
-   struct x86_function             sse2_program;
-   codegen_function func;
+   struct x86_function sse2_program;
+   tgsi_sse2_fs_function func;
    float immediates[TGSI_EXEC_NUM_IMMEDIATES][4];
 };
 
 
+/** cast wrapper */
+static INLINE struct sp_sse_fragment_shader *
+sp_sse_fragment_shader(const struct sp_fragment_shader *base)
+{
+   return (struct sp_sse_fragment_shader *) base;
+}
+
 
 static void
 fs_sse_prepare( const struct sp_fragment_shader *base,
                struct tgsi_exec_machine *machine,
-               struct tgsi_sampler *samplers )
+               struct tgsi_sampler **samplers )
 {
+   machine->Samplers = samplers;
 }
 
 
@@ -84,7 +86,7 @@ fs_sse_run( const struct sp_fragment_shader *base,
            struct tgsi_exec_machine *machine,
            struct quad_header *quad )
 {
-   struct sp_sse_fragment_shader *shader = (struct sp_sse_fragment_shader *) base;
+   struct sp_sse_fragment_shader *shader = sp_sse_fragment_shader(base);
 
    /* Compute X, Y, Z, W vals for this quad -- place in temp[0] for now */
    sp_setup_pos_vector(quad->posCoef, 
@@ -92,14 +94,13 @@ fs_sse_run( const struct sp_fragment_shader *base,
                       machine->Temps);
 
    /* init kill mask */
-   machine->Temps[TGSI_EXEC_TEMP_KILMASK_I].xyzw[TGSI_EXEC_TEMP_KILMASK_C].u[0] = 0x0;
+   tgsi_set_kill_mask(machine, 0x0);
+   tgsi_set_exec_mask(machine, 1, 1, 1, 1);
 
-   shader->func( machine->Inputs,
-                machine->Outputs,
+   shader->func( machine,
                 machine->Consts,
-                machine->Temps,
-                machine->InterpCoefs,
-                 shader->immediates
+                 (const float (*)[4])shader->immediates,
+                machine->InterpCoefs
                 //      , &machine->QuadPos
       );
 
@@ -110,7 +111,7 @@ fs_sse_run( const struct sp_fragment_shader *base,
 static void 
 fs_sse_delete( struct sp_fragment_shader *base )
 {
-   struct sp_sse_fragment_shader *shader = (struct sp_sse_fragment_shader *) base;
+   struct sp_sse_fragment_shader *shader = sp_sse_fragment_shader(base);
 
    x86_release_func( &shader->sse2_program );
    FREE(shader);
@@ -138,14 +139,14 @@ softpipe_create_fs_sse(struct softpipe_context *softpipe,
       return NULL;
    }
 
-   shader->func = (codegen_function) x86_get_func( &shader->sse2_program );
+   shader->func = (tgsi_sse2_fs_function) x86_get_func( &shader->sse2_program );
    if (!shader->func) {
       x86_release_func( &shader->sse2_program );
       FREE(shader);
       return NULL;
    }
 
-   shader->base.shader = *templ;
+   shader->base.shader.tokens = NULL; /* don't hold reference to templ->tokens */
    shader->base.prepare = fs_sse_prepare;
    shader->base.run = fs_sse_run;
    shader->base.delete = fs_sse_delete;
@@ -156,7 +157,7 @@ softpipe_create_fs_sse(struct softpipe_context *softpipe,
 
 #else
 
-/* Maybe put this varient in the header file.
+/* Maybe put this variant in the header file.
  */
 struct sp_fragment_shader *
 softpipe_create_fs_sse(struct softpipe_context *softpipe,