#include "../../chaos-drop.h" #include uint8_t CD_RAYTRACE_SHADER_ID = -1; struct cd_raytrace_cmd { /* Shader ID for Azur */ uint8_t shader_id; uint8_t _[3]; /* Camera used for rendering */ struct camera const *camera; /* Current y value */ int y; }; #include /* TODO: Write raytrace shader in assembler (MUCH NEEDED) */ void cd_raytrace_shader(void *uniforms0, void *cmd0, void *fragment) { memset(fragment, 0x55, azrp_width * azrp_frag_height * 2); uint32_t uniforms = (uint32_t)uniforms0; struct cd_raytrace_cmd *cmd = (struct cd_raytrace_cmd *)cmd0; int frag_height = uniforms; int h = (frag_height > 112 - cmd->y) ? 112 - cmd->y : frag_height; render_fragment(cmd->camera, (uint16_t *)fragment, cmd->y, h); cmd->y += h; } GCONSTRUCTOR static void register_shader(void) { CD_RAYTRACE_SHADER_ID = azrp_register_shader(cd_raytrace_shader); } void cd_raytrace(struct camera const *camera) { prof_enter(azrp_perf_cmdgen); struct cd_raytrace_cmd cmd; cmd.shader_id = CD_RAYTRACE_SHADER_ID; cmd.camera = camera; cmd.y = 0; azrp_queue_command(&cmd, sizeof cmd, 0, azrp_frag_count); prof_leave(azrp_perf_cmdgen); } void cd_raytrace_configure(void) { uint32_t value = azrp_frag_height; azrp_set_uniforms(CD_RAYTRACE_SHADER_ID, (void *)value); }