mirror of
https://github.com/Yours3lf/rpi-vk-driver.git
synced 2025-02-21 18:54:18 +01:00
fixed a couple of mistakes in assembler, added assembly shader to tri
This commit is contained in:
parent
6206204164
commit
9283288a7a
@ -2,6 +2,7 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "qpu_assembler.h"
|
||||||
#include "vc4_qpu_defines.h"
|
#include "vc4_qpu_defines.h"
|
||||||
|
|
||||||
/*********************************************************************************************************************
|
/*********************************************************************************************************************
|
||||||
@ -77,7 +78,7 @@ WS bit: ws
|
|||||||
REL bit: rel
|
REL bit: rel
|
||||||
REG bit: reg
|
REG bit: reg
|
||||||
SIGNED bit: signed
|
SIGNED bit: signed
|
||||||
Conditional execution for the ADD pipeline: never, always, zs, zc, ns, nc, cs, cc
|
Conditional execution for the ADD pipeline (default is never): never, always, zs, zc, ns, nc, cs, cc
|
||||||
Unpack modes (from regfile A, or if PM is set from R4): nop, 16a, 16b, 8d_rep, 8a, 8b, 8c, 8d
|
Unpack modes (from regfile A, or if PM is set from R4): nop, 16a, 16b, 8d_rep, 8a, 8b, 8c, 8d
|
||||||
|
|
||||||
6)
|
6)
|
||||||
@ -122,11 +123,6 @@ srcA, srcB can be: r0-r5 or a, b for regfiles A and B, or imm for the small imme
|
|||||||
==================================================================
|
==================================================================
|
||||||
==================================================================
|
==================================================================
|
||||||
|
|
||||||
|
|
||||||
dstAdd: rx0-31, r0-5, special regs
|
|
||||||
raddr_a_opt: ra0-31, r0-5, special regs
|
|
||||||
raddr_b_opt: rb0-31, r0-5, special regs
|
|
||||||
|
|
||||||
Examples:
|
Examples:
|
||||||
sig_none ; rx0.nop = add.pm.sf.always(r0, r1, 0) ; rx0.nop = fmul.always(r2, r3) ;
|
sig_none ; rx0.nop = add.pm.sf.always(r0, r1, 0) ; rx0.nop = fmul.always(r2, r3) ;
|
||||||
sig_branch ; rx0 = branch.pm.rel.reg.always(0xdeadbeef, ra1) ; rx0 = branch() ;
|
sig_branch ; rx0 = branch.pm.rel.reg.always(0xdeadbeef, ra1) ; rx0 = branch() ;
|
||||||
@ -135,6 +131,8 @@ sig_load_imm ; rx0.nop = load32.pm.sf.always(0xdeadbeef) ; rx0.nop
|
|||||||
sig_load_imm ; rx0.nop = load16.pm.sf.signed.always(1, 2) ; rx0.nop = load16.always() ;
|
sig_load_imm ; rx0.nop = load16.pm.sf.signed.always(1, 2) ; rx0.nop = load16.always() ;
|
||||||
#mov
|
#mov
|
||||||
sig_none ; rx0.nop = or(r0, r0) ; rx0 = v8min(r1, r1) ;
|
sig_none ; rx0.nop = or(r0, r0) ; rx0 = v8min(r1, r1) ;
|
||||||
|
#nop
|
||||||
|
sig_none ; nop = nop(nop, nop) ; nop = nop(nop, nop) ;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
uint64_t encode_alu(qpu_sig_bits sig_bits,
|
uint64_t encode_alu(qpu_sig_bits sig_bits,
|
||||||
@ -513,7 +511,7 @@ void parse_dst(char** str, qpu_waddr* waddr, uint8_t* pack_mode, unsigned is_add
|
|||||||
|
|
||||||
if(dst && dst[0] == 'r' && dst[1] == 'x')
|
if(dst && dst[0] == 'r' && dst[1] == 'x')
|
||||||
{
|
{
|
||||||
waddr_res = strtol(dst+2, 0, 0);
|
waddr_res = strtoul(dst+2, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned num_pack_a_str = sizeof(qpu_pack_a_str) / sizeof(const char *);
|
unsigned num_pack_a_str = sizeof(qpu_pack_a_str) / sizeof(const char *);
|
||||||
@ -642,7 +640,7 @@ void parse_op_modifiers(char** str, uint8_t* signed_or_unsigned, uint8_t* ws, ui
|
|||||||
*str += 1;
|
*str += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void parse_op(char** str, qpu_alu_type* type, qpu_op_add* op_add, qpu_op_mul* op_mul, uint8_t* is_sem_inc, qpu_load_type* load_type)
|
void parse_op(char** str, qpu_alu_type* type, qpu_op_add* op_add, qpu_op_mul* op_mul, uint8_t* is_sem_inc, qpu_load_type* load_type, unsigned is_add)
|
||||||
{
|
{
|
||||||
char* op = strtok(*str, ".");
|
char* op = strtok(*str, ".");
|
||||||
|
|
||||||
@ -677,21 +675,26 @@ void parse_op(char** str, qpu_alu_type* type, qpu_op_add* op_add, qpu_op_mul* op
|
|||||||
unsigned num_add_ops = sizeof(qpu_op_add_str) / sizeof(const char *);
|
unsigned num_add_ops = sizeof(qpu_op_add_str) / sizeof(const char *);
|
||||||
unsigned num_mul_ops = sizeof(qpu_op_mul_str) / sizeof(const char *);
|
unsigned num_mul_ops = sizeof(qpu_op_mul_str) / sizeof(const char *);
|
||||||
|
|
||||||
for(unsigned c = 0; c < num_add_ops && op; ++c)
|
if(is_add)
|
||||||
{
|
{
|
||||||
if(qpu_op_add_str[c] && strcmp(op, qpu_op_add_str[c]) == 0)
|
for(unsigned c = 0; c < num_add_ops && op; ++c)
|
||||||
{
|
{
|
||||||
*op_add = c;
|
if(qpu_op_add_str[c] && strcmp(op, qpu_op_add_str[c]) == 0)
|
||||||
break;
|
{
|
||||||
|
*op_add = c;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
for(unsigned c = 0; c < num_mul_ops && op; ++c)
|
|
||||||
{
|
{
|
||||||
if(qpu_op_mul_str[c] && strcmp(op, qpu_op_mul_str[c]) == 0)
|
for(unsigned c = 0; c < num_mul_ops && op; ++c)
|
||||||
{
|
{
|
||||||
*op_mul = c;
|
if(qpu_op_mul_str[c] && strcmp(op, qpu_op_mul_str[c]) == 0)
|
||||||
break;
|
{
|
||||||
|
*op_mul = c;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -757,7 +760,7 @@ void parse_args_alu(char** str, qpu_mux* in_a, qpu_mux* in_b, uint8_t* raddr_a,
|
|||||||
|
|
||||||
if(!raddr_a_res && arg && arg[0] == 'r' && arg[1] == 'a')
|
if(!raddr_a_res && arg && arg[0] == 'r' && arg[1] == 'a')
|
||||||
{
|
{
|
||||||
raddr_a_res = strtol(arg+2, 0, 0);
|
raddr_a_res = strtoul(arg+2, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -785,12 +788,12 @@ void parse_args_alu(char** str, qpu_mux* in_a, qpu_mux* in_b, uint8_t* raddr_a,
|
|||||||
|
|
||||||
if(!raddr_b_res && arg && arg[0] == 'r' && arg[1] == 'b')
|
if(!raddr_b_res && arg && arg[0] == 'r' && arg[1] == 'b')
|
||||||
{
|
{
|
||||||
raddr_b_res = strtol(arg+2, 0, 0);
|
raddr_b_res = strtoul(arg+2, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(is_si)
|
if(is_si)
|
||||||
{
|
{
|
||||||
uint32_t si = strtol(arg, 0, 0);
|
uint32_t si = strtoul(arg, 0, 0);
|
||||||
raddr_b_res = qpu_encode_small_immediate(si);
|
raddr_b_res = qpu_encode_small_immediate(si);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -813,7 +816,7 @@ void parse_args_sem(char** str, uint8_t* sem, uint32_t* imm32)
|
|||||||
|
|
||||||
if(arg)
|
if(arg)
|
||||||
{
|
{
|
||||||
*sem = strtol(arg, 0, 0);
|
*sem = strtoul(arg, 0, 0);
|
||||||
*str = arg;
|
*str = arg;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -821,7 +824,7 @@ void parse_args_sem(char** str, uint8_t* sem, uint32_t* imm32)
|
|||||||
|
|
||||||
if(arg)
|
if(arg)
|
||||||
{
|
{
|
||||||
*imm32 = strtol(arg, 0, 0);
|
*imm32 = strtoul(arg, 0, 0);
|
||||||
*str = arg;
|
*str = arg;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -840,7 +843,7 @@ void parse_args_branch(char** str, uint32_t* imm32, qpu_branch_cond* branch_cond
|
|||||||
|
|
||||||
if(arg)
|
if(arg)
|
||||||
{
|
{
|
||||||
*imm32 = strtol(arg, 0, 0);
|
*imm32 = strtoul(arg, 0, 0);
|
||||||
*str = arg;
|
*str = arg;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -881,7 +884,7 @@ void parse_args_branch(char** str, uint32_t* imm32, qpu_branch_cond* branch_cond
|
|||||||
|
|
||||||
if(!raddr_a_res && arg && arg[0] == 'r' && arg[1] == 'a')
|
if(!raddr_a_res && arg && arg[0] == 'r' && arg[1] == 'a')
|
||||||
{
|
{
|
||||||
raddr_a_res = strtol(arg+2, 0, 0);
|
raddr_a_res = strtoul(arg+2, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
*raddr_a = raddr_a_res;
|
*raddr_a = raddr_a_res;
|
||||||
@ -905,7 +908,7 @@ void parse_args_load(char** str, qpu_load_type load_type, uint32_t* imm32, uint1
|
|||||||
{
|
{
|
||||||
if(arg)
|
if(arg)
|
||||||
{
|
{
|
||||||
*imm32 = strtol(arg, 0, 0);
|
*imm32 = strtoul(arg, 0, 0);
|
||||||
*str = arg;
|
*str = arg;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -913,7 +916,7 @@ void parse_args_load(char** str, qpu_load_type load_type, uint32_t* imm32, uint1
|
|||||||
{
|
{
|
||||||
if(arg)
|
if(arg)
|
||||||
{
|
{
|
||||||
*ms_imm16 = strtol(arg, 0, 0);
|
*ms_imm16 = strtoul(arg, 0, 0);
|
||||||
*str = arg;
|
*str = arg;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -921,7 +924,7 @@ void parse_args_load(char** str, qpu_load_type load_type, uint32_t* imm32, uint1
|
|||||||
|
|
||||||
if(arg)
|
if(arg)
|
||||||
{
|
{
|
||||||
*ls_imm16 = strtol(arg, 0, 0);
|
*ls_imm16 = strtoul(arg, 0, 0);
|
||||||
*str = arg;
|
*str = arg;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -968,8 +971,8 @@ void assemble_qpu_asm(char* str, uint64_t* instructions)
|
|||||||
qpu_mux mul_b = 0;
|
qpu_mux mul_b = 0;
|
||||||
qpu_mux add_a = 0;
|
qpu_mux add_a = 0;
|
||||||
qpu_mux add_b = 0;
|
qpu_mux add_b = 0;
|
||||||
qpu_cond cond_mul = QPU_COND_ALWAYS;
|
qpu_cond cond_mul = QPU_COND_NEVER;
|
||||||
qpu_cond cond_add = QPU_COND_ALWAYS;
|
qpu_cond cond_add = QPU_COND_NEVER;
|
||||||
qpu_waddr waddr_add = QPU_W_NOP;
|
qpu_waddr waddr_add = QPU_W_NOP;
|
||||||
qpu_waddr waddr_mul = QPU_W_NOP;
|
qpu_waddr waddr_mul = QPU_W_NOP;
|
||||||
qpu_waddr raddr_a = QPU_R_NOP;
|
qpu_waddr raddr_a = QPU_R_NOP;
|
||||||
@ -1003,7 +1006,7 @@ void assemble_qpu_asm(char* str, uint64_t* instructions)
|
|||||||
//check op
|
//check op
|
||||||
token = strtok(token, " \n\v\f\r\t=(");
|
token = strtok(token, " \n\v\f\r\t=(");
|
||||||
unsigned has_modifiers = strstr(token, ".") != 0;
|
unsigned has_modifiers = strstr(token, ".") != 0;
|
||||||
parse_op(&token, &type, &op_add, &op_mul, &is_sem_inc, &load_type);
|
parse_op(&token, &type, &op_add, &op_mul, &is_sem_inc, &load_type, 1);
|
||||||
|
|
||||||
//get modifiers
|
//get modifiers
|
||||||
if(has_modifiers)
|
if(has_modifiers)
|
||||||
@ -1044,7 +1047,7 @@ void assemble_qpu_asm(char* str, uint64_t* instructions)
|
|||||||
//check op
|
//check op
|
||||||
token = strtok(token, " \n\v\f\r\t=(");
|
token = strtok(token, " \n\v\f\r\t=(");
|
||||||
has_modifiers = strstr(token, ".") != 0;
|
has_modifiers = strstr(token, ".") != 0;
|
||||||
parse_op(&token, &type, &op_add, &op_mul, &is_sem_inc, &load_type);
|
parse_op(&token, &type, &op_add, &op_mul, &is_sem_inc, &load_type, 0);
|
||||||
|
|
||||||
//get modifiers
|
//get modifiers
|
||||||
if(has_modifiers)
|
if(has_modifiers)
|
||||||
@ -1439,4 +1442,4 @@ void disassemble_qpu_asm(uint64_t instruction)
|
|||||||
}
|
}
|
||||||
|
|
||||||
printf("\n");
|
printf("\n");
|
||||||
}
|
}
|
||||||
|
@ -2,5 +2,13 @@
|
|||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
void disassemble_qpu_asm(uint64_t instruction);
|
void disassemble_qpu_asm(uint64_t instruction);
|
||||||
void assemble_qpu_asm(char* str, uint64_t* instructions);
|
void assemble_qpu_asm(char* str, uint64_t* instructions);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
@ -3,7 +3,7 @@ file(GLOB testSrc
|
|||||||
"*.cpp"
|
"*.cpp"
|
||||||
)
|
)
|
||||||
|
|
||||||
add_executable(triangle ${testSrc})
|
add_executable(triangle "../../QPUassembler/qpu_assembler.c" ${testSrc} )
|
||||||
target_compile_options(triangle PRIVATE -Wall -std=c++11)
|
target_compile_options(triangle PRIVATE -Wall -std=c++11 -std=c11)
|
||||||
|
|
||||||
target_link_libraries(triangle vulkan-1-rpi)
|
target_link_libraries(triangle vulkan-1-rpi)
|
||||||
|
@ -8,6 +8,8 @@
|
|||||||
|
|
||||||
#include "driver/vkExt.h"
|
#include "driver/vkExt.h"
|
||||||
|
|
||||||
|
#include "QPUassembler/qpu_assembler.h"
|
||||||
|
|
||||||
//#define GLFW_INCLUDE_VULKAN
|
//#define GLFW_INCLUDE_VULKAN
|
||||||
//#define VK_USE_PLATFORM_WIN32_KHR
|
//#define VK_USE_PLATFORM_WIN32_KHR
|
||||||
//#include <GLFW/glfw3.h>
|
//#include <GLFW/glfw3.h>
|
||||||
@ -846,17 +848,47 @@ VkShaderModule VulkanCreateShaderModule(VkDevice& device, char* byteStream, uint
|
|||||||
|
|
||||||
void CreateShaders()
|
void CreateShaders()
|
||||||
{
|
{
|
||||||
//char* vptr = (char*)malloc(strlen(vertShader) + 1);
|
char asm_code[] =
|
||||||
//memcpy(vptr, vertShader, strlen(vertShader) + 1);
|
"sig_none ; nop = nop(r0, r0) ; nop = nop(r0, r0) ;"
|
||||||
|
"sig_none ; nop = nop(r0, r0) ; nop = nop(r0, r0) ;"
|
||||||
|
"sig_load_imm ; r0 = load32.always(0xffffffff) ; nop = load32() ;"
|
||||||
|
"sig_none ; tlb_color_all = or.always(r0, r0) ; nop = nop(r0, r0) ;"
|
||||||
|
"sig_end ; nop = nop(r0, r0) ; nop = nop(r0, r0) ;"
|
||||||
|
"sig_none ; nop = nop(r0, r0) ; nop = nop(r0, r0) ;"
|
||||||
|
"sig_unlock_score ; nop = nop(r0, r0) ; nop = nop(r0, r0) ;"
|
||||||
|
"\0";
|
||||||
|
|
||||||
//char* fptr = (char*)malloc(strlen(fragShader) + 1);
|
unsigned num_instructions = 0;
|
||||||
//memcpy(fptr, fragShader, strlen(fragShader) + 1);
|
char* ptr = asm_code;
|
||||||
|
while(ptr && *ptr != '\0')
|
||||||
|
{
|
||||||
|
ptr = strstr(ptr, ";");
|
||||||
|
if(!ptr) break;
|
||||||
|
ptr = strstr(ptr+(ptr!=0), ";");
|
||||||
|
if(!ptr) break;
|
||||||
|
ptr = strstr(ptr+(ptr!=0), ";");
|
||||||
|
if(ptr)
|
||||||
|
{
|
||||||
|
ptr += 1;
|
||||||
|
num_instructions += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t instruction_size = sizeof(uint64_t)*num_instructions;
|
||||||
|
uint64_t* instructions = (uint64_t*)malloc(instruction_size);
|
||||||
|
|
||||||
|
assemble_qpu_asm(asm_code, instructions);
|
||||||
|
|
||||||
|
for(uint64_t c = 0; c < num_instructions; ++c)
|
||||||
|
{
|
||||||
|
disassemble_qpu_asm(instructions[c]);
|
||||||
|
}
|
||||||
|
|
||||||
char* vptr = (char*)malloc(sizeof(vertBytes));
|
char* vptr = (char*)malloc(sizeof(vertBytes));
|
||||||
memcpy(vptr, vertBytes, sizeof(vertBytes));
|
memcpy(vptr, vertBytes, sizeof(vertBytes));
|
||||||
|
|
||||||
char* fptr = (char*)malloc(sizeof(fragBytes));
|
//char* fptr = (char*)malloc(sizeof(fragBytes));
|
||||||
memcpy(fptr, fragBytes, sizeof(fragBytes));
|
//memcpy(fptr, fragBytes, sizeof(fragBytes));
|
||||||
|
|
||||||
char* cptr = (char*)malloc(sizeof(coordinateBytes));
|
char* cptr = (char*)malloc(sizeof(coordinateBytes));
|
||||||
memcpy(cptr, coordinateBytes, sizeof(coordinateBytes));
|
memcpy(cptr, coordinateBytes, sizeof(coordinateBytes));
|
||||||
@ -868,7 +900,8 @@ void CreateShaders()
|
|||||||
|
|
||||||
char* fragStreams[] =
|
char* fragStreams[] =
|
||||||
{
|
{
|
||||||
0, 0, fptr, 0
|
//0, 0, fptr, 0
|
||||||
|
0, 0, (char*)instructions, 0
|
||||||
};
|
};
|
||||||
|
|
||||||
uint32_t vertNumbytes[] =
|
uint32_t vertNumbytes[] =
|
||||||
@ -878,7 +911,8 @@ void CreateShaders()
|
|||||||
|
|
||||||
uint32_t fragNumbytes[] =
|
uint32_t fragNumbytes[] =
|
||||||
{
|
{
|
||||||
0, 0, sizeof(fragBytes), 0
|
//0, 0, sizeof(fragBytes), 0
|
||||||
|
0, 0, instruction_size, 0
|
||||||
};
|
};
|
||||||
|
|
||||||
VkRpiShaderModuleAssemblyCreateInfoKHR vertexShaderModuleCreateInfo;
|
VkRpiShaderModuleAssemblyCreateInfoKHR vertexShaderModuleCreateInfo;
|
||||||
@ -896,7 +930,7 @@ void CreateShaders()
|
|||||||
assert(fsModule);
|
assert(fsModule);
|
||||||
|
|
||||||
free(vptr);
|
free(vptr);
|
||||||
free(fptr);
|
//free(fptr);
|
||||||
free(cptr);
|
free(cptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user