1
0
mirror of https://github.com/Yours3lf/rpi-vk-driver.git synced 2025-02-20 17:54:17 +01:00

fixed a couple of mistakes in assembler, added assembly shader to tri

This commit is contained in:
Unknown 2019-04-21 12:03:45 +01:00
parent 6206204164
commit 9283288a7a
4 changed files with 88 additions and 43 deletions

View File

@ -2,6 +2,7 @@
#include <stdlib.h>
#include <string.h>
#include "qpu_assembler.h"
#include "vc4_qpu_defines.h"
/*********************************************************************************************************************
@ -77,7 +78,7 @@ WS bit: ws
REL bit: rel
REG bit: reg
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
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:
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() ;
@ -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() ;
#mov
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,
@ -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')
{
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 *);
@ -642,7 +640,7 @@ void parse_op_modifiers(char** str, uint8_t* signed_or_unsigned, uint8_t* ws, ui
*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, ".");
@ -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_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;
break;
if(qpu_op_add_str[c] && strcmp(op, qpu_op_add_str[c]) == 0)
{
*op_add = c;
break;
}
}
}
for(unsigned c = 0; c < num_mul_ops && op; ++c)
else
{
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;
break;
if(qpu_op_mul_str[c] && strcmp(op, qpu_op_mul_str[c]) == 0)
{
*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')
{
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')
{
raddr_b_res = strtol(arg+2, 0, 0);
raddr_b_res = strtoul(arg+2, 0, 0);
}
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);
}
@ -813,7 +816,7 @@ void parse_args_sem(char** str, uint8_t* sem, uint32_t* imm32)
if(arg)
{
*sem = strtol(arg, 0, 0);
*sem = strtoul(arg, 0, 0);
*str = arg;
}
@ -821,7 +824,7 @@ void parse_args_sem(char** str, uint8_t* sem, uint32_t* imm32)
if(arg)
{
*imm32 = strtol(arg, 0, 0);
*imm32 = strtoul(arg, 0, 0);
*str = arg;
}
@ -840,7 +843,7 @@ void parse_args_branch(char** str, uint32_t* imm32, qpu_branch_cond* branch_cond
if(arg)
{
*imm32 = strtol(arg, 0, 0);
*imm32 = strtoul(arg, 0, 0);
*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')
{
raddr_a_res = strtol(arg+2, 0, 0);
raddr_a_res = strtoul(arg+2, 0, 0);
}
*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)
{
*imm32 = strtol(arg, 0, 0);
*imm32 = strtoul(arg, 0, 0);
*str = arg;
}
}
@ -913,7 +916,7 @@ void parse_args_load(char** str, qpu_load_type load_type, uint32_t* imm32, uint1
{
if(arg)
{
*ms_imm16 = strtol(arg, 0, 0);
*ms_imm16 = strtoul(arg, 0, 0);
*str = arg;
}
@ -921,7 +924,7 @@ void parse_args_load(char** str, qpu_load_type load_type, uint32_t* imm32, uint1
if(arg)
{
*ls_imm16 = strtol(arg, 0, 0);
*ls_imm16 = strtoul(arg, 0, 0);
*str = arg;
}
}
@ -968,8 +971,8 @@ void assemble_qpu_asm(char* str, uint64_t* instructions)
qpu_mux mul_b = 0;
qpu_mux add_a = 0;
qpu_mux add_b = 0;
qpu_cond cond_mul = QPU_COND_ALWAYS;
qpu_cond cond_add = QPU_COND_ALWAYS;
qpu_cond cond_mul = QPU_COND_NEVER;
qpu_cond cond_add = QPU_COND_NEVER;
qpu_waddr waddr_add = QPU_W_NOP;
qpu_waddr waddr_mul = QPU_W_NOP;
qpu_waddr raddr_a = QPU_R_NOP;
@ -1003,7 +1006,7 @@ void assemble_qpu_asm(char* str, uint64_t* instructions)
//check op
token = strtok(token, " \n\v\f\r\t=(");
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
if(has_modifiers)
@ -1044,7 +1047,7 @@ void assemble_qpu_asm(char* str, uint64_t* instructions)
//check op
token = strtok(token, " \n\v\f\r\t=(");
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
if(has_modifiers)
@ -1439,4 +1442,4 @@ void disassemble_qpu_asm(uint64_t instruction)
}
printf("\n");
}
}

View File

@ -2,5 +2,13 @@
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
void disassemble_qpu_asm(uint64_t instruction);
void assemble_qpu_asm(char* str, uint64_t* instructions);
#ifdef __cplusplus
}
#endif

View File

@ -3,7 +3,7 @@ file(GLOB testSrc
"*.cpp"
)
add_executable(triangle ${testSrc})
target_compile_options(triangle PRIVATE -Wall -std=c++11)
add_executable(triangle "../../QPUassembler/qpu_assembler.c" ${testSrc} )
target_compile_options(triangle PRIVATE -Wall -std=c++11 -std=c11)
target_link_libraries(triangle vulkan-1-rpi)

View File

@ -8,6 +8,8 @@
#include "driver/vkExt.h"
#include "QPUassembler/qpu_assembler.h"
//#define GLFW_INCLUDE_VULKAN
//#define VK_USE_PLATFORM_WIN32_KHR
//#include <GLFW/glfw3.h>
@ -846,17 +848,47 @@ VkShaderModule VulkanCreateShaderModule(VkDevice& device, char* byteStream, uint
void CreateShaders()
{
//char* vptr = (char*)malloc(strlen(vertShader) + 1);
//memcpy(vptr, vertShader, strlen(vertShader) + 1);
char asm_code[] =
"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);
//memcpy(fptr, fragShader, strlen(fragShader) + 1);
unsigned num_instructions = 0;
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));
memcpy(vptr, vertBytes, sizeof(vertBytes));
char* fptr = (char*)malloc(sizeof(fragBytes));
memcpy(fptr, fragBytes, sizeof(fragBytes));
//char* fptr = (char*)malloc(sizeof(fragBytes));
//memcpy(fptr, fragBytes, sizeof(fragBytes));
char* cptr = (char*)malloc(sizeof(coordinateBytes));
memcpy(cptr, coordinateBytes, sizeof(coordinateBytes));
@ -868,7 +900,8 @@ void CreateShaders()
char* fragStreams[] =
{
0, 0, fptr, 0
//0, 0, fptr, 0
0, 0, (char*)instructions, 0
};
uint32_t vertNumbytes[] =
@ -878,7 +911,8 @@ void CreateShaders()
uint32_t fragNumbytes[] =
{
0, 0, sizeof(fragBytes), 0
//0, 0, sizeof(fragBytes), 0
0, 0, instruction_size, 0
};
VkRpiShaderModuleAssemblyCreateInfoKHR vertexShaderModuleCreateInfo;
@ -896,7 +930,7 @@ void CreateShaders()
assert(fsModule);
free(vptr);
free(fptr);
//free(fptr);
free(cptr);
}