Avoid sv magic global
authorCafe <cafe@not.applicable>
Wed, 26 Jul 2017 00:00:00 +0000 (00:00 +0000)
committerCafe <cafe@not.applicable>
Wed, 26 Jul 2017 23:30:05 +0000 (23:30 +0000)
re.c

diff --git a/re.c b/re.c
index a58e9bb561b596a41b854613db92e1941f1c714a..1bcfa2ce35bcb523008e0d002df6193fc30dd6bf 100644 (file)
--- a/re.c
+++ b/re.c
@@ -19,13 +19,8 @@ uint64_t framebuffer;
 uint64_t last_fragment;
 uint64_t last_tiler;
 
-uint64_t set_value_foo;
-
-void *set_value_helper(int fd) {
+void *set_value_helper(int fd, uint32_t out) {
        void* packet = galloc(sizeof(struct job_descriptor_header) + sizeof(struct payload_set_value));
-       void* magic = galloc(16);
-
-       set_value_foo = (uint32_t) magic;
 
        struct job_descriptor_header header = {
                .exception_status = JOB_NOT_STARTED,
@@ -41,7 +36,7 @@ void *set_value_helper(int fd) {
        };
 
        struct payload_set_value payload = {
-               .out = (uint32_t) magic,
+               .out = out,
                .unknown = 0x03
        };
 
@@ -52,13 +47,13 @@ void *set_value_helper(int fd) {
        return packet;
 }
 
-uint64_t make_mfbd(bool tiler)
+uint64_t make_mfbd(bool tiler, uint32_t sv_magic)
 {
        struct tentative_mfbd *mfbd = galloc(sizeof(struct tentative_mfbd));
        memset(mfbd, 0, sizeof(struct tentative_mfbd));
 
        /* zeroes */
-       mfbd->block2[0] = set_value_foo;
+       mfbd->block2[0] = sv_magic;
        mfbd->block2[1] = (uint32_t) galloc(64);
        mfbd->ugaT = (uint32_t) galloc(64);
        mfbd->unknown_gpu_address = (uint32_t) galloc(64);
@@ -88,7 +83,7 @@ uint64_t make_mfbd(bool tiler)
        return (uint64_t ) (uint32_t) mfbd | MFBD | (tiler ? FBD_VERTEX_TILER : FBD_FRAGMENT);
 }
 
-int job_chain_fragment(int fd) {
+int job_chain_fragment(int fd, uint32_t sv_magic) {
        void* packet = galloc(sizeof(struct job_descriptor_header) + sizeof(struct payload_fragment));
 
        struct job_descriptor_header header = {
@@ -107,7 +102,7 @@ int job_chain_fragment(int fd) {
        struct payload_fragment payload = {
                .min_tile_coord = MAKE_TILE_COORD(0, 0, 0),
                .max_tile_coord = MAKE_TILE_COORD(29, 45, 0),
-               .fragment_fbd = make_mfbd(false)
+               .fragment_fbd = make_mfbd(false, sv_magic)
        };
 
        memcpy(packet, &header, sizeof(header));
@@ -188,7 +183,7 @@ uint32_t upload_vertices()
        return (uint32_t) vb;
 }
 
-void* vertex_tiler_helper(int fd, bool tiler, uint32_t vertex_buffer)
+void* vertex_tiler_helper(int fd, bool tiler, uint32_t vertex_buffer, uint32_t sv_magic)
 {
        void* packet = galloc(sizeof(struct job_descriptor_header) + sizeof(struct payload_vertex_tiler32));
 
@@ -227,7 +222,7 @@ void* vertex_tiler_helper(int fd, bool tiler, uint32_t vertex_buffer)
                .unknown6 = (uint32_t) galloc(64),
                .nullForVertex = tiler ? (uint32_t) galloc(64) : 0,
                .null4 = 0,
-               .fbd = (uint32_t) make_mfbd(true),
+               .fbd = (uint32_t) make_mfbd(true, sv_magic),
                .unknown7 = tiler ? 0 : ((uint32_t) galloc(64) | 1) /* TODO */
        };
 
@@ -353,13 +348,12 @@ void* vertex_tiler_helper(int fd, bool tiler, uint32_t vertex_buffer)
        return packet;
 }
 
-int job_chain_vertex_tiler(int fd) {
-       void *set = set_value_helper(fd);
-
+int job_chain_vertex_tiler(int fd, uint32_t sv_magic) {
        uint32_t vertex_buffer = upload_vertices();
 
-       void *vertex = vertex_tiler_helper(fd, false, vertex_buffer);
-       void *tiler = vertex_tiler_helper(fd, true, vertex_buffer);
+       void *set = set_value_helper(fd, sv_magic);
+       void *vertex = vertex_tiler_helper(fd, false, vertex_buffer, sv_magic);
+       void *tiler = vertex_tiler_helper(fd, true, vertex_buffer, sv_magic);
 
        ((struct job_descriptor_header*) set)->next_job = (uint32_t) vertex;
        ((struct job_descriptor_header*) vertex)->next_job = (uint32_t) tiler;
@@ -450,8 +444,9 @@ int main()
        framebuffer = 0x1CAFE0000;
        printf("Framebuffer: %LX\n", framebuffer);
 
-       job_chain_vertex_tiler(fd);
-       job_chain_fragment(fd);
+       uint32_t sv_magic = (uint32_t) galloc(16);
+       job_chain_vertex_tiler(fd, sv_magic);
+       job_chain_fragment(fd, sv_magic);
        job_chain_replay(fd);
        sync_gpu(fd, (uint8_t*) cbma_top, cbma_top, cbma_bottom - cbma_top);
        flush_job_queue(fd);