Skip to content

Commit 27832a8

Browse files
committed
Nearly finished high precision shader building
1 parent 65b657a commit 27832a8

13 files changed

Lines changed: 201 additions & 120 deletions

File tree

_deps/glfw-src

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Subproject commit 7482de6071d21db77a7236155da44c172a7f6c9e

_deps/glm-src

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Subproject commit 8d1fd52e5ab5590e2c81768ace50c72bae28f2ed

_deps/imgui-src

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Subproject commit 60d7fb207eeb46d6363dd4bde10b35991bae0ce7

src/glsl_transpiled/glsl_big_number.cpp

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
#include <glsl_transpiled/glsl_big_number.h>
2+
#include <bit>
3+
#include <cstdint>
4+
25

36
hp_vec2 initialize_hp_vec2(number x, number y) {
47
hp_vec2 res;
@@ -26,6 +29,12 @@ number infinite_number() {
2629
return res;
2730
}
2831

32+
number number_integer(const uint n){
33+
number res = null_number();
34+
res.limb[FRACTIONAL_SIZE] = n;
35+
return res;
36+
}
37+
2938
number number_one() {
3039
number res = null_number();
3140
res.limb[FRACTIONAL_SIZE] = 1u;
@@ -379,6 +388,16 @@ number div_uint(number n, uint d) {
379388
return q;
380389
}
381390

391+
392+
393+
float uintBitsToFloat(const uint n) {
394+
return std::bit_cast<float>(n);
395+
}
396+
397+
uint floatBitsToUint(const float n){
398+
return std::bit_cast<uint>(n);
399+
}
400+
382401
number float_to_number(float f) {
383402
if (f == 0.0) return null_number();
384403

@@ -414,12 +433,6 @@ number float_to_number(float f) {
414433
return res;
415434
}
416435

417-
#include <bit>
418-
419-
float uintBitsToFloat(const uint n) {
420-
return std::bit_cast<float>(n);
421-
}
422-
423436
float number_to_float(number n) {
424437
if (is_zero(n)) return 0.0;
425438
if (n.is_infinite) {

src/glsl_transpiled/glsl_big_number.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ struct number {
1313
struct hp_vec2 {
1414
number x;
1515
number y;
16+
hp_vec2(number x,number y) : x(x), y(y){};
1617
};
1718

1819
hp_vec2 initialize_hp_vec2(number x, number y);
@@ -64,4 +65,6 @@ number hp_div(number n, number d);
6465

6566
number div_uint(number n, uint d);
6667

67-
number hp_sqrt(number x);
68+
number hp_sqrt(number x);
69+
70+
number number_integer(const uint n);

src/glsl_transpiled/glsl_types.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
1-
#include <glfw/glfw3.h>
1+
#pragma once
2+
3+
#include <glm/common.hpp>
24

35
typedef uint32_t uint;
46

57
struct uvec2 {
6-
uint x;
7-
uint y;
8+
uint x, y;
9+
uvec2(uint x, uint y) : x(x), y(y) {}
10+
uvec2() : x(0), y(0) {}
811
};

src/high_precision/high_precision_constant.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,5 +63,4 @@ number compute_ln2(){
6363
sum = hp_add(sum, iteration_term);
6464
}
6565
return shift_left(sum, 1);
66-
}
67-
66+
}

src/main.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,7 @@ int main() {
279279

280280
static Shader shader_program;
281281
build_shader_path(shader_program, "shaders/plotter.vert", "shaders/plotter.frag");
282-
std::cout << transpile_to_highp_glsl(get_block(shader_program.fragment_source, "ELEMENTARY_FUNCTION_DEFINITIONS"), SRC_HIGH_PRECISION_FRAG);
282+
std::cout << transpile_to_highp_glsl(get_block(shader_program.fragment_source, "ELEMENTARY_FUNCTION_DEFINITIONS"), SRC_HIGH_PRECISION_FUNCTIONS_FRAG);
283283
return 0;
284284
static Shader picker;
285285
string picker_frag = SRC_PICKER_FRAG;

src/preprocessor/string_builder.cpp

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
#include <preprocessor/string_builder.h>
22
#include <types/type_mapper.h>
3+
#include <transformer/transformer.h>
4+
#include <preprocessor/transpiler.h>
5+
#include <high_precision/high_precision_constant.h>
36
static std::map<Operator, unsigned char> operator_to_id_mapper;
47

58
static bool handled_const = false;
@@ -134,3 +137,51 @@ string get_preprocessor_string(const vector<TokenOperator>& operators) {
134137

135138
return ss.str();
136139
}
140+
141+
string convert_number_to_glsl(const number& num){
142+
return big_number_to_glsl_string(num.limb,num.sign,num.is_infinite);
143+
}
144+
145+
string declare_constant(const std::string& variable_name, const number& value){
146+
return "const number " + variable_name + " = " + convert_number_to_glsl(value) + ";\n";
147+
}
148+
149+
string declare_constant_with_expression(const std::string& variable_name, const std::string& value){
150+
return "const number " + variable_name + " = " + value + ";\n";
151+
}
152+
153+
string declare_constant(const std::string& variable_name, const hp_vec2& value){
154+
return "const number " + variable_name + " = initialize_hp_vec2(" + convert_number_to_glsl(value.x) + "," + convert_number_to_glsl(value.y) + ");\n";
155+
}
156+
157+
string build_high_precision_shader_string(const std::string& highp_header, const std::string& highp_function_declarations, const std::string& lowp_function_declarations){
158+
string out = highp_header;
159+
const number pi = compute_pi();
160+
const number e = compute_e();
161+
const number ln_2 = compute_ln2();
162+
const number one = number_one();
163+
const number two = number_integer(2);
164+
const number three = number_integer(3);
165+
const number zero = null_number();
166+
167+
declare_constant("PI",pi);
168+
declare_constant("E", e);
169+
declare_constant("LN2", ln_2);
170+
declare_constant("REAL_ZERO", zero);
171+
declare_constant("REAL_ONE", number_one());
172+
declare_constant("REAL_TWO", two);
173+
declare_constant("INFINITY", infinite_number());
174+
175+
declare_constant("TWO_PI_OVER_3", hp_div(hp_mult(two,pi),three));
176+
declare_constant("TWO_OVER_PI", hp_div(two,pi));
177+
178+
declare_constant("ZERO", hp_vec2(zero,zero));
179+
declare_constant("CPI", hp_vec2(pi,zero));
180+
declare_constant("ONE", hp_vec2(one,zero));
181+
declare_constant("MINUS_ONE", hp_vec2(hp_neg(one),zero));
182+
declare_constant("I", hp_vec2(zero,one));
183+
184+
out += transpile_to_highp_glsl(lowp_function_declarations,highp_function_declarations);
185+
186+
187+
}

src/shaders/embedded_shaders.h

Lines changed: 64 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,58 +1,8 @@
11
#pragma once
22
#include <string>
33

4-
inline std::string SRC_HIGH_PRECISION_FRAG =
5-
R"shdr(#version 300 es
6-
7-
precision highp float;
8-
9-
const int LIMB_SIZE = 32;
10-
const int FRACTIONAL_SIZE = LIMB_SIZE/2;
11-
12-
struct number{
13-
uint limb[LIMB_SIZE];
14-
int sign;
15-
bool is_infinite;
16-
};
17-
18-
struct hp_vec2{
19-
number x;
20-
number y;
21-
};
22-
23-
hp_vec2 initialize_hp_vec2(number x, number y){
24-
hp_vec2 res;
25-
res.x = x;
26-
res.y = y;
27-
return res;
28-
}
29-
30-
number null_number(){
31-
number res;
32-
for(int i = 0; i < LIMB_SIZE; ++i){
33-
res.limb[i] = 0u;
34-
}
35-
res.sign = 1;
36-
return res;
37-
}
38-
39-
number infinite_number(){
40-
number res;
41-
for(int i = 0; i < LIMB_SIZE; ++i){
42-
res.limb[i] = (1u<<31u)-1u;
43-
}
44-
res.sign = 1;
45-
res.is_infinite = true;
46-
return res;
47-
}
48-
49-
number number_one() {
50-
number res = null_number();
51-
res.limb[FRACTIONAL_SIZE] = 1u;
52-
return res;
53-
}
54-
55-
number hp_neg(number a){
4+
inline std::string SRC_HIGH_PRECISION_FUNCTIONS_FRAG =
5+
R"shdr(number hp_neg(number a){
566
a.sign *= -1;
577
return a;
588
}
@@ -344,7 +294,7 @@ number hp_div(number n, number d){
344294
q_hat = 0xFFFFu;
345295
r_hat = u_jn1 + v_n1;
346296
} else {
347-
)shdr" R"shdr(q_hat = dividend / v_n1;
297+
q_hat = dividend / v_n1;
348298
r_hat = dividend % v_n1;
349299
}
350300
@@ -367,7 +317,7 @@ number hp_div(number n, number d){
367317
borrow = (diff < 0) ? 1u : 0u;
368318
}
369319
int final_diff = int(get_half(u, j + n_len)) - int(k) - int(borrow);
370-
set_half(u, j + n_len, uint(final_diff) & 0xFFFFu);
320+
set_half(u, j + n_len, uint(final_diff) & 0x)shdr" R"shdr(FFFFu);
371321
if (final_diff < 0) {
372322
q_hat--;
373323
uint carry_hp_add = 0u;
@@ -658,7 +608,7 @@ number hp_cos(number x) {
658608
if (is_zero(term)) break;
659609
660610
if (i % 2 == 1) {
661-
sum = hp_su)shdr" R"shdr(b(sum, term);
611+
sum = hp_sub(sum, term);
662612
} else {
663613
sum = hp_add(sum, term);
664614
}
@@ -690,7 +640,7 @@ number hp_atan(number z){
690640
sum = hp_sub(sum,iteration_term);
691641
}
692642
else{
693-
sum = hp_add(sum,iteration_term);
643+
sum = hp_add(sum)shdr" R"shdr(,iteration_term);
694644
}
695645
}
696646
return shift_left(sum, 1);
@@ -810,6 +760,64 @@ hp_vec2 hp_mult(number a, hp_vec2 b) {
810760
return initialize_hp_vec2(hp_mult(a, b.x), hp_mult(a, b.y));
811761
})shdr" ;
812762

763+
inline std::string SRC_HIGH_PRECISION_HEADER_FRAG =
764+
R"shdr(#version 300 es
765+
766+
precision highp float;
767+
768+
const int LIMB_SIZE = 32;
769+
const int FRACTIONAL_SIZE = LIMB_SIZE/2;
770+
771+
struct number{
772+
uint limb[LIMB_SIZE];
773+
int sign;
774+
bool is_infinite;
775+
};
776+
777+
struct hp_vec2{
778+
number x;
779+
number y;
780+
};
781+
782+
hp_vec2 initialize_hp_vec2(number x, number y){
783+
hp_vec2 res;
784+
res.x = x;
785+
res.y = y;
786+
return res;
787+
}
788+
789+
number initialize_number(uint limb[LIMB_SIZE], int sign, bool is_infinite){
790+
number res;
791+
res.limb = limb;
792+
res.sign = sign;
793+
res.is_infinite = is_infinite;
794+
}
795+
796+
number null_number(){
797+
number res;
798+
for(int i = 0; i < LIMB_SIZE; ++i){
799+
res.limb[i] = 0u;
800+
}
801+
res.sign = 1;
802+
return res;
803+
}
804+
805+
number infinite_number(){
806+
number res;
807+
for(int i = 0; i < LIMB_SIZE; ++i){
808+
res.limb[i] = (1u<<31u)-1u;
809+
}
810+
res.sign = 1;
811+
res.is_infinite = true;
812+
return res;
813+
}
814+
815+
number number_one() {
816+
number res = null_number();
817+
res.limb[FRACTIONAL_SIZE] = 1u;
818+
return res;
819+
})shdr" ;
820+
813821
inline std::string SRC_PICKER_FRAG =
814822
R"shdr(#version 300 es
815823
precision highp float;

0 commit comments

Comments
 (0)