summaryrefslogtreecommitdiff
path: root/src/core/shader.h
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2019-12-15 00:39:18 +0800
committerchai <chaifix@163.com>2019-12-15 00:39:18 +0800
commit749bbc6a54e50c297ab49d9e515a3679651d1461 (patch)
tree097bbe044332e816aa481db1a4e325b8d3f63b0d /src/core/shader.h
parent3f44877edfe4c301b258d522bcb4e8d9b6e92382 (diff)
*misc
Diffstat (limited to 'src/core/shader.h')
-rw-r--r--src/core/shader.h181
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