chaos-drop/src/backend/gint/shader.cc

57 lines
1.3 KiB
C++

#include "../../chaos-drop.h"
#include <azur/gint/render.h>
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 <string.h>
/* 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);
}