From 60665b490c536eba027592229177695727e08284 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Wed, 26 Feb 2014 06:42:54 +0100 Subject: [PATCH] (PSP1) Add WIP psp1_video_inl.h --- psp1/psp1_video_inl.h | 172 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 172 insertions(+) create mode 100644 psp1/psp1_video_inl.h diff --git a/psp1/psp1_video_inl.h b/psp1/psp1_video_inl.h new file mode 100644 index 0000000000..dbca029862 --- /dev/null +++ b/psp1/psp1_video_inl.h @@ -0,0 +1,172 @@ +#ifndef __PSP1_VIDEO_INL_H +#define __PSP1_VIDEO_INL_H + +#include +#include "pspgu.h" + +typedef void (*GuCallback)(int); + +typedef struct +{ + GuCallback sig; + GuCallback fin; + short signal_history[16]; + int signal_offset; + int kernel_event_flag; + int ge_callback_id; + + GuSwapBuffersCallback swapBuffersCallback; + int swapBuffersBehaviour; +} GuSettings; + +typedef struct +{ + unsigned int* start; + unsigned int* current; + int parent_context; +} GuDisplayList; + +typedef struct +{ + GuDisplayList list; + int scissor_enable; + int scissor_start[2]; + int scissor_end[2]; + int near_plane; + int far_plane; + int depth_offset; + int fragment_2x; + int texture_function; + int texture_proj_map_mode; + int texture_map_mode; + int sprite_mode[4]; + unsigned int clear_color; + unsigned int clear_stencil; + unsigned int clear_depth; + int texture_mode; +} GuContext; + +typedef struct +{ + int pixel_size; + int frame_width; + void* frame_buffer; + void* disp_buffer; + void* depth_buffer; + int depth_width; + int width; + int height; +} GuDrawBuffer; + +typedef struct +{ + /* row 0 */ + + unsigned char enable; // Light enable + unsigned char type; // Light type + unsigned char xpos; // X position + unsigned char ypos; // Y position + + /* row 1 */ + + unsigned char zpos; // Z position + unsigned char xdir; // X direction + unsigned char ydir; // Y direction + unsigned char zdir; // Z direction + + /* row 2 */ + + unsigned char ambient; // Ambient color + unsigned char diffuse; // Diffuse color + unsigned char specular; // Specular color + unsigned char constant; // Constant attenuation + + /* row 3 */ + + unsigned char linear; // Linear attenuation + unsigned char quadratic;// Quadratic attenuation + unsigned char exponent; // Light exponent + unsigned char cutoff; // Light cutoff +} GuLightSettings; + +extern unsigned int gu_current_frame; +extern GuContext gu_contexts[3]; +extern int ge_list_executed[2]; +extern void* ge_edram_address; +extern GuSettings gu_settings; +extern GuDisplayList* gu_list; +extern int gu_curr_context; +extern int gu_init; +extern int gu_display_on; +extern int gu_call_mode; +extern int gu_states; +extern GuDrawBuffer gu_draw_buffer; + +extern unsigned int* gu_object_stack[]; +extern int gu_object_stack_depth; + +extern GuLightSettings light_settings[4]; + +static int tbpcmd_tbl[8] = { 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7 }; // 0x30A18 +static int tbwcmd_tbl[8] = { 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf }; // 0x30A38 +static int tsizecmd_tbl[8] = { 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf }; // 0x30A58 + +#define sendCommandi(cmd, argument) *(gu_list->current++) = (cmd << 24) | (argument & 0xffffff) + +#define sendCommandiStall(cmd, argument) \ +{ \ + sendCommandi(cmd,argument); \ + if (!gu_object_stack_depth && !gu_curr_context) \ + sceGeListUpdateStallAddr(ge_list_executed[0],gu_list->current); \ +} + +#define __sceGuCopyImage(psm, sx, sy, width, height, srcw, src, dx, dy, destw, dest) \ + sendCommandi(178,((unsigned int)(src)) & 0xffffff); \ + sendCommandi(179,((((unsigned int)(src)) & 0xff000000) >> 8)|(srcw)); \ + sendCommandi(235,((sy) << 10)|(sx)); \ + sendCommandi(180,((unsigned int)(dest)) & 0xffffff); \ + sendCommandi(181,((((unsigned int)(dest)) & 0xff000000) >> 8)| (destw)); \ + sendCommandi(236,((dy) << 10) | (dx)); \ + sendCommandi(238,(((height)-1) << 10)|((width)-1)); \ + sendCommandi(234,((psm) ^ 0x03) ? 0 : 1) + +#define __sceGuSync(mode, what) \ + switch (mode) \ + { \ + case 0: return sceGeDrawSync(what); \ + case 3: return sceGeListSync(ge_list_executed[0],what); \ + case 4: return sceGeListSync(ge_list_executed[1],what); \ + default: case 1: case 2: return 0; \ + } + +#define __sceGuTexFlush() sendCommandf(203,0.0f) + +#define __sceGuTexImage(mipmap, width, height, tbw, tbp) \ + sendCommandi(tbpcmd_tbl[(mipmap)],((unsigned int)(tbp)) & 0xffffff); \ + sendCommandi(tbwcmd_tbl[(mipmap)],((((unsigned int)(tbp)) >> 8) & 0x0f0000)|(tbw)); \ + sendCommandi(tsizecmd_tbl[(mipmap)],(getExp(height) << 8)|(getExp((width)))); \ + __sceGuTexFlush() + +#define __sceGuCallList(list) \ +{ \ + unsigned int list_addr = (unsigned int)list; \ + if (gu_call_mode == 1) \ + { \ + sendCommandi(14,(list_addr >> 16) | 0x110000); \ + sendCommandi(12,list_addr & 0xffff); \ + sendCommandiStall(0,0); \ + } \ + else \ + { \ + sendCommandi(16,(list_addr >> 8) & 0xf0000); \ + sendCommandiStall(10,list_addr & 0xffffff); \ + } \ +} + +void sendCommandf(int cmd, float argument); + +void callbackSig(int id, void* arg); +void callbackFin(int id, void* arg); +void resetValues(); + +#endif