Fix FBD
authorCafe <cafe@not.applicable>
Wed, 26 Jul 2017 00:00:00 +0000 (00:00 +0000)
committerCafe <cafe@not.applicable>
Wed, 26 Jul 2017 15:48:50 +0000 (15:48 +0000)
re.c

diff --git a/re.c b/re.c
index 4afc0099f67132187fe0c03a295c1b7ac0f6639e..afad5b93034c36afa06615318de26bdf679317ff 100644 (file)
--- a/re.c
+++ b/re.c
@@ -67,7 +67,7 @@ int job_chain_set_value(int fd) {
        return 0;
 }
 
-struct tentative_mfbd *make_mfbd()
+uint64_t make_mfbd(bool tiler)
 {
        struct tentative_mfbd *mfbd = galloc(sizeof(struct tentative_mfbd));
        memset(mfbd, 0, sizeof(struct tentative_mfbd));
@@ -86,20 +86,21 @@ struct tentative_mfbd *make_mfbd()
        mfbd->flags = 0x1000;
        mfbd->heap_free_address = 0x102000000;
        mfbd->blah = 0x1F00000000;
-       mfbd->unknown3 = 0xFFFFF8C0;
+       mfbd->unknown3 = tiler ? 0 : 0xFFFFF8C0;
        mfbd->unknown1 = 0x200;
 
-       mfbd->block1[4] = 0x02D802A6;
-       mfbd->block1[6] = 0x02D802A6;
-       mfbd->block1[7] = 0x01001080;
-       mfbd->block1[8] = 0xC0210000;
+       mfbd->block1[4] = 0x02D801C2;
+       mfbd->block1[6] = 0x02D801C2;
+       mfbd->block1[7] = tiler ? 0x04001080 : 0x01001080;
+       mfbd->block1[8] = tiler ? 0x000000FF : 0xC0210000;
+       mfbd->block1[9] = tiler ? 0x3F800000 : 0x00000000;
 
        mfbd->block3[0] = 0x00000158;
        mfbd->block3[1] = 0x00000420;
        mfbd->block3[14] = 0x04000000;
        mfbd->block3[15] = 0x880A8899;
 
-       return mfbd;
+       return (uint64_t ) (uint32_t) mfbd | MFBD | (tiler ? FBD_VERTEX_TILER : FBD_FRAGMENT);
 }
 
 void free_mfbd(struct tentative_mfbd *mfbd) {
@@ -114,7 +115,6 @@ void free_mfbd(struct tentative_mfbd *mfbd) {
 
 int job_chain_fragment(int fd) {
        uint64_t framebuffer = (uint64_t) (uint32_t) galloc(29 * 16 * 45 * 16 * 4 * 2);
-       struct tentative_mfbd *mfbd = make_mfbd();
 
        void* packet = galloc(sizeof(struct job_descriptor_header) + sizeof(struct payload_fragment));
 
@@ -134,7 +134,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 = (uint64_t) (uint32_t) mfbd | MFBD | 2
+               .fragment_fbd = make_mfbd(false)
        };
 
        memcpy(packet, &header, sizeof(header));
@@ -225,7 +225,7 @@ void* vertex_tiler_helper(int fd, bool tiler)
                .unknown6 = (uint32_t) galloc(64),
                .nullForVertex = tiler ? (uint32_t) galloc(64) : 0,
                .null4 = 0,
-               .fbd = (uint32_t) make_mfbd(),
+               .fbd = (uint32_t) make_mfbd(true),
                .unknown7 = tiler ? 0 : (uint32_t) galloc(64)
        };