Initial pass at instruction / declaration fetch
authorIan Romanick <idr@us.ibm.com>
Tue, 29 Jan 2008 18:56:53 +0000 (10:56 -0800)
committerBen Skeggs <skeggsb@gmail.com>
Fri, 15 Feb 2008 02:50:26 +0000 (13:50 +1100)
src/mesa/pipe/cell/spu/spu_exec.c
src/mesa/pipe/cell/spu/spu_main.h

index 6888e97caf62ed415b52d6ab65b7e8ded7375014..f43278198e1d1e1f0c10bc9dfbe280f3d3f1ea18 100644 (file)
@@ -50,6 +50,9 @@
  *   Brian Paul
  */
 
+#include <libmisc.h>
+#include <spu_mfcio.h>
+
 #include "pipe/p_compiler.h"
 #include "pipe/p_state.h"
 #include "pipe/p_util.h"
@@ -57,6 +60,7 @@
 #include "pipe/tgsi/util/tgsi_parse.h"
 #include "pipe/tgsi/util/tgsi_util.h"
 #include "spu_exec.h"
+#include "spu_main.h"
 
 #define TILE_TOP_LEFT     0
 #define TILE_TOP_RIGHT    1
@@ -2329,12 +2333,30 @@ spu_exec_machine_run( struct spu_exec_machine *mach )
 
    /* execute declarations (interpolants) */
    for (i = 0; i < mach->NumDeclarations; i++) {
+      uint8_t buffer[sizeof(struct tgsi_full_declaration) + 32] ALIGN16_ATTRIB;
+      struct tgsi_full_declaration decl;
+      unsigned long decl_addr = (unsigned long) (mach->Declarations+i);
+      unsigned size = ((sizeof(decl) + (decl_addr & 0x0f) + 0x0f) & ~0x0f);
+
+      mfc_get(buffer, decl_addr & ~0x0f, size, TAG_INSTRUCTION_FETCH, 0, 0);
+      wait_on_mask(1 << TAG_INSTRUCTION_FETCH);
+
+      memcpy(& decl, buffer + (decl_addr & 0x0f), sizeof(decl));
       exec_declaration( mach, mach->Declarations+i );
    }
 
    /* execute instructions, until pc is set to -1 */
    while (pc != -1) {
+      uint8_t buffer[sizeof(struct tgsi_full_instruction) + 32] ALIGN16_ATTRIB;
+      struct tgsi_full_instruction inst;
+      unsigned long inst_addr = (unsigned long) (mach->Instructions + pc);
+      unsigned size = ((sizeof(inst) + (inst_addr & 0x0f) + 0x0f) & ~0x0f);
+
       assert(pc < mach->NumInstructions);
+      mfc_get(buffer, inst_addr & ~0x0f, size, TAG_INSTRUCTION_FETCH, 0, 0);
+      wait_on_mask(1 << TAG_INSTRUCTION_FETCH);
+
+      memcpy(& inst, buffer + (inst_addr & 0x0f), sizeof(inst));
       exec_instruction( mach, mach->Instructions + pc, &pc );
    }
 
index 73f9ed29d669f8104c9577632bff5da0d2967940..8be5268f52d3f54fa4279ede58eb0a729e1a131e 100644 (file)
@@ -96,6 +96,7 @@ extern boolean Debug;
 #define TAG_BATCH_BUFFER      17
 #define TAG_MISC              18
 #define TAG_TEXTURE_TILE      19
+#define TAG_INSTRUCTION_FETCH 20