diff options
author | chai <chaifix@163.com> | 2019-12-15 00:39:18 +0800 |
---|---|---|
committer | chai <chaifix@163.com> | 2019-12-15 00:39:18 +0800 |
commit | 749bbc6a54e50c297ab49d9e515a3679651d1461 (patch) | |
tree | 097bbe044332e816aa481db1a4e325b8d3f63b0d /src/core/shader.h | |
parent | 3f44877edfe4c301b258d522bcb4e8d9b6e92382 (diff) |
*misc
Diffstat (limited to 'src/core/shader.h')
-rw-r--r-- | src/core/shader.h | 181 |
1 files changed, 92 insertions, 89 deletions
diff --git a/src/core/shader.h b/src/core/shader.h index 2e87ac5..d74581d 100644 --- a/src/core/shader.h +++ b/src/core/shader.h @@ -4,8 +4,9 @@ #include "../math/math.h" #include "vert.h" #include "texture.h" +#include "clip.h" -typedef struct UniformCollection { +typedef struct { /*built in varaibles*/ Mat4* model; Mat4* view; @@ -23,12 +24,13 @@ typedef struct UniformCollection { void* userdata; } UniformCollection; -#define TEX(i) (uniforms->var_tex[i]) -#define UM4(i) (&uniforms->var_mat4[i]) -#define UV2(i) (&uniforms->var_vec2[i]) -#define UV3(i) (&uniforms->var_vec3[i]) -#define UV4(i) (&uniforms->var_vec4[i]) -#define UN(i) (&uniforms->var_num[i]) +#define UTEX(i) (uniforms->var_tex[i]) +#define UM4(i) (&uniforms->var_mat4[i]) +#define UV2(i) (&uniforms->var_vec2[i]) +#define UV3(i) (&uniforms->var_vec3[i]) +#define UV4(i) (&uniforms->var_vec4[i]) +#define UN(i) (&uniforms->var_num[i]) +#define UU (uniforms->userdata) typedef struct VertexShaderIn { Vert* vertex; @@ -39,10 +41,10 @@ typedef void(*VertexShader)(UniformCollection* uniforms, VertexShaderIn* in, Vec typedef struct FragmentShaderIn { /*value from vertices interpolation*/ Vec3 position; - Vec3 normal; - Vec3 tangent; - Vec2 texcoord; - Color color; + Vec3 normal; + Vec3 tangent; + Vec2 texcoord; + Color color; Vec4 joint; Vec4 weight; /*value from registers interpolation*/ @@ -52,68 +54,68 @@ typedef struct FragmentShaderIn { Vec4 v4[6]; } FragmentShaderIn; -typedef bool(*FragmentShader)(UniformCollection* uniforms, FragmentShaderIn* in, Color* color); +typedef bool(*FragmentShader)(UniformCollection* uniforms, FragmentShaderIn* in, Color32* color); -typedef struct Program { +typedef struct { VertexShader vertexshader; - FragmentShader fragmentshader; + FragmentShader fragmentshader; uint varying_flag; } Program; #define VARYING_NONE (0) -#define VARYING_POSITION (1U << 31) -#define VARYING_NORMAL (1U << 30) -#define VARYING_TANGENT (1U << 29) -#define VARYING_TEXCOORD (1U << 28) -#define VARYING_COLOR (1U << 27) -#define VARYING_JOINT (1U << 26) -#define VARYING_WEIGHT (1U << 25) +#define VARYING_POSITION (1u << 31) +#define VARYING_NORMAL (1u << 30) +#define VARYING_TANGENT (1u << 29) +#define VARYING_TEXCOORD (1u << 28) +#define VARYING_COLOR (1u << 27) +#define VARYING_JOINT (1u << 26) +#define VARYING_WEIGHT (1u << 25) -#define VARYING_UNUSED (1U << 24) +#define VARYING_UNUSED (1u << 24) #define VARYING_BASIC ( VARYING_UNUSED | VARYING_POSITION | VARYING_NORMAL | VARYING_TANGENT | VARYING_TEXCOORD | VARYING_COLOR | VARYING_JOINT | VARYING_WEIGHT ) -#define VARYING_NUM_00 (1U << 20) -#define VARYING_NUM_01 (1U << 21) -#define VARYING_NUM_02 (1U << 22) -#define VARYING_NUM_03 (1U << 23) +#define VARYING_NUM_00 (1u) +#define VARYING_NUM_01 (1u << 1) +#define VARYING_NUM_02 (1u << 2) +#define VARYING_NUM_03 (1u << 3) #define VARYING_NUM (VARYING_NUM_00 | VARYING_NUM_01 | VARYING_NUM_02 | VARYING_NUM_03 ) -#define VARYING_V2_00 (1U) -#define VARYING_V2_01 (1U << 1) -#define VARYING_V2_02 (1U << 2) -#define VARYING_V2_03 (1U << 3) -#define VARYING_V2_04 (1U << 4) -#define VARYING_V2_05 (1U << 5) +#define VARYING_V2_00 (1u << 4) +#define VARYING_V2_01 (1u << 5) +#define VARYING_V2_02 (1u << 6) +#define VARYING_V2_03 (1u << 7) +#define VARYING_V2_04 (1u << 8) +#define VARYING_V2_05 (1u << 9) #define VARYING_V2 (VARYING_V2_00 | VARYING_V2_01 | VARYING_V2_02 | VARYING_V2_03 | VARYING_V2_04 | VARYING_V2_05) -#define VARYING_V3_00 (1U << 6) -#define VARYING_V3_01 (1U << 7) -#define VARYING_V3_02 (1U << 8) -#define VARYING_V3_03 (1U << 9) -#define VARYING_V3_04 (1U << 10) -#define VARYING_V3_05 (1U << 11) -#define VARYING_V3_06 (1U << 12) -#define VARYING_V3_07 (1U << 13) +#define VARYING_V3_00 (1u << 10) +#define VARYING_V3_01 (1u << 11) +#define VARYING_V3_02 (1u << 12) +#define VARYING_V3_03 (1u << 13) +#define VARYING_V3_04 (1u << 14) +#define VARYING_V3_05 (1u << 15) +#define VARYING_V3_06 (1u << 16) +#define VARYING_V3_07 (1u << 17) #define VARYING_V3 (VARYING_V3_00 | VARYING_V3_01 | VARYING_V3_02 | VARYING_V3_03 | VARYING_V3_04 | VARYING_V3_05| VARYING_V3_06| VARYING_V3_07) -#define VARYING_V4_00 (1U << 14) -#define VARYING_V4_01 (1U << 15) -#define VARYING_V4_02 (1U << 16) -#define VARYING_V4_03 (1U << 17) -#define VARYING_V4_04 (1U << 18) -#define VARYING_V4_05 (1U << 19) +#define VARYING_V4_00 (1u << 18) +#define VARYING_V4_01 (1u << 19) +#define VARYING_V4_02 (1u << 20) +#define VARYING_V4_03 (1u << 21) +#define VARYING_V4_04 (1u << 22) +#define VARYING_V4_05 (1u << 23) #define VARYING_V4 (VARYING_V4_00 | VARYING_V4_01 | VARYING_V4_02 | VARYING_V4_03 | VARYING_V4_04 | VARYING_V4_05) #define VARYING_EXTRA (VARYING_NUM | VARYING_V2 | VARYING_V3 | VARYING_V4) -float* ssrS_bcpnum(Vec3* bc, float A, float B, float C, float* out); Color* ssrS_bcpcolor(Vec3* bc, Color A, Color B, Color C, Color* out); +float* ssrS_bcpnum(Vec3* bc, float* A, float* B, float* C, float* out); Vec2* ssrS_bcpvec2(Vec3* bc, Vec2* A, Vec2* B, Vec2* C, Vec2* out); Vec3* ssrS_bcpvec3(Vec3* bc, Vec3* A, Vec3* B, Vec3* C, Vec3* out); Vec4* ssrS_bcpvec4(Vec3* bc, Vec4* A, Vec4* B, Vec4* C, Vec4* out); @@ -124,23 +126,24 @@ void ssrS_lerpvec2(float t, Vec2* A, Vec2* B, Vec2* out); void ssrS_lerpvec3(float t, Vec3* A, Vec3* B, Vec3* out); void ssrS_lerpvec4(float t, Vec4* A, Vec4* B, Vec4* out); -void ssrS_setregisters(uint flag, int capacity); - /* ** 顶点数据外,还提供额外的寄存器用来存储vertex shader输出的顶点额外数据 ** 共24个 */ -enum RegisterType { +typedef enum { REGTYPE_NUM = 1, REGTYPE_VEC2, REGTYPE_VEC4, REGTYPE_VEC3, -}; +} RegisterType; -typedef struct Register { +typedef struct { uint length; uint type; + uint element_size; /*element in bytes, 4\8\12\16*/ union { + byte* data; + /*pecific*/ float* num; Vec2* v2; Vec3* v3; @@ -148,52 +151,52 @@ typedef struct Register { }; } Register; +typedef struct { + uint element_size; + byte* data; /*mutable, either of registers or temp-registers*/ + byte** accessor; + BcpInterpolator bcp_interpolator; + byte* output; /*fragment-in*/ +} ActiveReg; + +#define REG_TOTAL 24 #define REG_NUM_COUNT 4 #define REG_V2_COUNT 6 #define REG_V3_COUNT 8 #define REG_V4_COUNT 6 -Register reg_num[4]; -Register reg_v2[6]; -Register reg_v3[8]; -Register reg_v4[6]; - -/*寄存器指针,使用错误可能会出现野指针*/ - -float* reg_num_00; -float* reg_num_01; -float* reg_num_02; -float* reg_num_03; - -Vec2* reg_v2_00; -Vec2* reg_v2_01; -Vec2* reg_v2_02; -Vec2* reg_v2_03; -Vec2* reg_v2_04; -Vec2* reg_v2_05; - -Vec3* reg_v3_00; -Vec3* reg_v3_01; -Vec3* reg_v3_02; -Vec3* reg_v3_03; -Vec3* reg_v3_04; -Vec3* reg_v3_05; -Vec3* reg_v3_06; -Vec3* reg_v3_07; - -Vec4* reg_v4_00; -Vec4* reg_v4_01; -Vec4* reg_v4_02; -Vec4* reg_v4_03; -Vec4* reg_v4_04; -Vec4* reg_v4_05; +Register registers[REG_TOTAL]; +ActiveReg active_regs[REG_TOTAL]; +uint open_regsi[REG_TOTAL]; /*draw call用到的寄存器,可以索引到registers和active_regs*/ + +#define REG_NUM_OFFSET 0 +#define REG_V2_OFFSET 4 +#define REG_V3_OFFSET 10 +#define REG_V4_OFFSET 18 +#define REG_NUM(i) (registers[i]) +#define REG_V2(i) (registers[REG_V2_OFFSET + i]) +#define REG_V3(i) (registers[REG_V3_OFFSET + i]) +#define REG_V4(i) (registers[REG_V4_OFFSET + i]) + +/*寄存器指针accessor,指向寄存器中的某个值,用于在shader里快速访问,使用错误可能会出现野指针*/ +float *reg_num_00, *reg_num_01, *reg_num_02, *reg_num_03; +Vec2 *reg_v2_00, *reg_v2_01, *reg_v2_02, *reg_v2_03, *reg_v2_04, *reg_v2_05; +Vec3 *reg_v3_00, *reg_v3_01, *reg_v3_02, *reg_v3_03, *reg_v3_04, *reg_v3_05, *reg_v3_06, *reg_v3_07; +Vec4 *reg_v4_00, *reg_v4_01, *reg_v4_02, *reg_v4_03, *reg_v4_04, *reg_v4_05; + +void ssrS_openregs(uint varying_flag); +void ssrS_setactiveregr(); +void ssrS_setactiveregc(); +void ssrS_solveregs(Vec3* bc, uint a, uint b, uint c); +void ssrS_setregisters(int capacity); /*设置寄存器指针,指向寄存器(在fragment阶段,指针会指向fragmentIn结构)*/ -void ssrS_setupregisterpoints(uint extra_varying_flag, int idx); +void ssrS_setupregisterpoints(int idx); /*设置寄存器指针,指向fragIn结构*/ -void ssrS_setregtofragin(uint extra_varying_flag, FragmentShaderIn* frag_in); +void ssrS_setregtofragin(); -Color32 texture2d(Texture* tex, Vec2* uv); +#define tex2d(tex, uv) \ +texture_sampling(tex, ssr_getfiltermode(), ssr_getwrapmode(), (uv).x, (uv).y) #endif
\ No newline at end of file |