summaryrefslogtreecommitdiff
path: root/src/core/shader.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/shader.h')
-rw-r--r--src/core/shader.h113
1 files changed, 50 insertions, 63 deletions
diff --git a/src/core/shader.h b/src/core/shader.h
index fd71f5a..f433f0e 100644
--- a/src/core/shader.h
+++ b/src/core/shader.h
@@ -4,7 +4,6 @@
#include "../math/math.h"
#include "vert.h"
#include "texture.h"
-#include "clip.h"
typedef struct {
/*built in varaibles*/
@@ -32,26 +31,23 @@ typedef struct {
#define UN(i) (&uniforms->var_num[i])
#define UU (uniforms->userdata)
-typedef struct VertexShaderIn {
+#define REG_TOTAL 32
+#define REG_NUM_COUNT 4
+#define REG_V2_COUNT 8
+#define REG_V3_COUNT 12
+#define REG_V4_COUNT 8
+
+typedef struct {
Vert* vertex;
} VertexShaderIn;
typedef void(*VertexShader)(UniformCollection* uniforms, VertexShaderIn* in, Vec4* homocoord);
-typedef struct FragmentShaderIn {
- /*value from vertices interpolation*/
- Vec3 position;
- Vec3 normal;
- Vec3 tangent;
- Vec2 texcoord;
- Color color;
- Vec4 joint;
- Vec4 weight;
- /*value from registers interpolation*/
- float num[4];
- Vec2 v2[6];
- Vec3 v3[8];
- Vec4 v4[6];
+typedef struct {
+ float num[REG_NUM_COUNT];
+ Vec2 v2[REG_V2_COUNT];
+ Vec3 v3[REG_V3_COUNT];
+ Vec4 v4[REG_V4_COUNT];
} FragmentShaderIn;
typedef bool(*FragmentShader)(UniformCollection* uniforms, FragmentShaderIn* in, Color32* color);
@@ -64,18 +60,6 @@ typedef struct {
#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_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)
#define VARYING_NUM_01 (1u << 1)
#define VARYING_NUM_02 (1u << 2)
@@ -89,30 +73,38 @@ typedef struct {
#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 << 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 << 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)
+#define VARYING_V2_06 (1u << 10)
+#define VARYING_V2_07 (1u << 11)
+
+#define VARYING_V2 (VARYING_V2_00 | VARYING_V2_01 | VARYING_V2_02 | VARYING_V2_03 | VARYING_V2_04 | VARYING_V2_05 | VARYING_V2_06 | VARYING_V2_07)
+
+#define VARYING_V3_00 (1u << 12)
+#define VARYING_V3_01 (1u << 13)
+#define VARYING_V3_02 (1u << 14)
+#define VARYING_V3_03 (1u << 15)
+#define VARYING_V3_04 (1u << 16)
+#define VARYING_V3_05 (1u << 17)
+#define VARYING_V3_06 (1u << 18)
+#define VARYING_V3_07 (1u << 19)
+#define VARYING_V3_08 (1u << 20)
+#define VARYING_V3_09 (1u << 21)
+#define VARYING_V3_10 (1u << 22)
+#define VARYING_V3_11 (1u << 23)
+
+#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 | VARYING_V3_08 |VARYING_V3_09 | VARYING_V3_10 | VARYING_V3_11)
+
+#define VARYING_V4_00 (1u << 24)
+#define VARYING_V4_01 (1u << 25)
+#define VARYING_V4_02 (1u << 26)
+#define VARYING_V4_03 (1u << 27)
+#define VARYING_V4_04 (1u << 28)
+#define VARYING_V4_05 (1u << 29)
+#define VARYING_V4_06 (1u << 30)
+#define VARYING_V4_07 (1u << 31)
+
+#define VARYING_V4 (VARYING_V4_00 | VARYING_V4_01 | VARYING_V4_02 | VARYING_V4_03 | VARYING_V4_04 | VARYING_V4_05 | VARYING_V4_06 | VARYING_V4_07)
+
+#define VARYING_ANY (VARYING_NUM | VARYING_V2 | VARYING_V3 | VARYING_V4)
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);
@@ -151,6 +143,9 @@ typedef struct {
};
} Register;
+typedef void* (*BcpInterpolator)(Vec3* bc, void* a, void* b, void* c, void* out);
+typedef void* (*LinearInterpolator)(float t, void* a, void* b, void* c, void* out);
+
typedef struct {
uint element_size;
byte* data; /*mutable, either of registers or temp-registers*/
@@ -159,21 +154,15 @@ typedef struct {
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 registers[REG_TOTAL];
ActiveReg active_regs[REG_TOTAL];
uint open_regsi[REG_TOTAL]; /*draw call用到的寄存器,可以索引到registers和active_regs*/
/*寄存器指针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;
+Vec2 *reg_v2_00, *reg_v2_01, *reg_v2_02, *reg_v2_03, *reg_v2_04, *reg_v2_05, *reg_v2_06, *reg_v2_07;
+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, *reg_v3_08, *reg_v3_09, *reg_v3_10, *reg_v3_11;
+Vec4 *reg_v4_00, *reg_v4_01, *reg_v4_02, *reg_v4_03, *reg_v4_04, *reg_v4_05, *reg_v4_06, *reg_v4_07;
void ssrS_openregs(uint varying_flag);
void ssrS_setactiveregr();
@@ -187,8 +176,6 @@ void ssrS_setupregisterpoints(int idx);
/*设置寄存器指针,指向fragIn结构*/
void ssrS_setregtofragin();
-void ssrS_solveprops(uint varying, Vec3* bc, Vert* a, Vert* b, Vert* c);
-
#define tex2d(tex, uv) \
texture_sampling(tex, ssr_getfiltermode(), ssr_getwrapmode(), (uv).x, (uv).y)