Skip to content

Commit cb7c9b8

Browse files
committed
(probably for AMD) enable 'GL_GOOGLE_cpp_style_line_directive' in preamble
1 parent b4a0636 commit cb7c9b8

File tree

6 files changed

+67
-3
lines changed

6 files changed

+67
-3
lines changed

server/src/merge_views.rs

Lines changed: 57 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,20 @@ pub fn generate_merge_list<'a>(nodes: &'a [FilialTuple], sources: &'a HashMap<Pa
3434
// invariant: nodes_iter always has _at least_ one element. Can't save a not-file :B
3535
let first = nodes_iter.next().unwrap().0;
3636
let first_path = graph.get_node(first);
37+
let first_source = sources.get(&first_path).unwrap();
38+
39+
let version_line_offset = find_version_offset(first_source);
40+
let version_char_offsets = char_offset_for_line(version_line_offset, first_source);
41+
add_preamble(
42+
version_line_offset,
43+
version_char_offsets.1,
44+
first_path.to_str().unwrap(),
45+
first_source,
46+
&mut merge_list,
47+
&mut extra_lines,
48+
);
3749

38-
last_offset_set.insert((first, None), 0);
50+
last_offset_set.insert((first, None), version_char_offsets.1);
3951

4052
// stack to keep track of the depth first traversal
4153
let mut stack = VecDeque::<NodeIndex>::new();
@@ -53,8 +65,8 @@ pub fn generate_merge_list<'a>(nodes: &'a [FilialTuple], sources: &'a HashMap<Pa
5365
// now we add a view of the remainder of the root file
5466
let offset = *last_offset_set.get(&(first, None)).unwrap();
5567

56-
let len = sources.get(&first_path).unwrap().len();
57-
merge_list.push_back(&sources.get(&first_path).unwrap()[min(offset, len)..]);
68+
let len = first_source.len();
69+
merge_list.push_back(&first_source[min(offset, len)..]);
5870

5971
let total_len = merge_list.iter().fold(0, |a, b| a + b.len());
6072

@@ -171,6 +183,30 @@ fn char_offset_for_line(line_num: usize, source: &str) -> (usize, usize) {
171183
(char_for_line, char_following_line)
172184
}
173185

186+
fn find_version_offset(source: &str) -> usize {
187+
source
188+
.lines()
189+
.enumerate()
190+
.find(|(_, line)| line.starts_with("#version "))
191+
.map_or(0, |(i, _)| i)
192+
}
193+
194+
fn add_preamble<'a>(
195+
version_line_offset: usize, version_char_offset: usize, path: &str, source: &'a str, merge_list: &mut LinkedList<&'a str>,
196+
extra_lines: &mut Vec<String>,
197+
) {
198+
// TODO: Optifine #define preabmle
199+
merge_list.push_back(&source[..version_char_offset]);
200+
let google_line_directive = format!(
201+
"#extension GL_GOOGLE_cpp_style_line_directive : enable\n#line {} \"{}\"\n",
202+
// +2 because 0 indexed but #line is 1 indexed and references the *following* line
203+
version_line_offset + 2,
204+
path,
205+
);
206+
extra_lines.push(google_line_directive);
207+
unsafe_get_and_insert(merge_list, extra_lines);
208+
}
209+
174210
fn add_opening_line_directive(path: &Path, merge_list: &mut LinkedList<&str>, extra_lines: &mut Vec<String>) {
175211
let line_directive = format!("#line 1 \"{}\"\n", path.to_str().unwrap().replace('\\', "\\\\"));
176212
extra_lines.push(line_directive);
@@ -242,6 +278,11 @@ mod merge_view_test {
242278
let merge_file = tmp_path.join("shaders").join("final.fsh.merge");
243279

244280
let mut truth = fs::read_to_string(merge_file).unwrap();
281+
truth = truth.replacen(
282+
"!!",
283+
&tmp_path.join("shaders").join("final.fsh").to_str().unwrap().replace('\\', "\\\\"),
284+
1,
285+
);
245286
truth = truth.replacen(
246287
"!!",
247288
&tmp_path.join("shaders").join("common.glsl").to_str().unwrap().replace('\\', "\\\\"),
@@ -306,6 +347,12 @@ mod merge_view_test {
306347

307348
let mut truth = fs::read_to_string(merge_file).unwrap();
308349

350+
truth = truth.replacen(
351+
"!!",
352+
&tmp_path.join("shaders").join("final.fsh").to_str().unwrap().replace('\\', "\\\\"),
353+
1,
354+
);
355+
309356
for file in &["sample.glsl", "burger.glsl", "sample.glsl", "test.glsl", "sample.glsl"] {
310357
let path = tmp_path.clone();
311358
truth = truth.replacen(
@@ -380,6 +427,12 @@ mod merge_view_test {
380427

381428
let mut truth = fs::read_to_string(merge_file).unwrap();
382429

430+
truth = truth.replacen(
431+
"!!",
432+
&tmp_path.join("shaders").join("final.fsh").to_str().unwrap().replace('\\', "\\\\"),
433+
1,
434+
);
435+
383436
for file in &["sample.glsl", "burger.glsl", "sample.glsl", "test.glsl", "sample.glsl"] {
384437
let path = tmp_path.clone();
385438
truth = truth.replacen(
@@ -464,6 +517,7 @@ mod merge_view_test {
464517
let mut truth = fs::read_to_string(merge_file).unwrap();
465518

466519
for file in &[
520+
PathBuf::new().join("final.fsh").to_str().unwrap(),
467521
PathBuf::new().join("utils").join("utilities.glsl").to_str().unwrap(),
468522
PathBuf::new().join("utils").join("stuff1.glsl").to_str().unwrap(),
469523
PathBuf::new().join("utils").join("utilities.glsl").to_str().unwrap(),

server/testdata/01/final.fsh.merge

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
#version 120
2+
#extension GL_GOOGLE_cpp_style_line_directive : enable
3+
#line 2 "!!"
24

35
#line 1 "!!"
46
float test() {

server/testdata/02/final.fsh.merge

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
#version 120
2+
#extension GL_GOOGLE_cpp_style_line_directive : enable
3+
#line 2 "!!"
24

35
#line 1 "!!"
46
int sample() {

server/testdata/03/final.fsh.merge

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
#version 120
2+
#extension GL_GOOGLE_cpp_style_line_directive : enable
3+
#line 2 "!!"
24

35
#line 1 "!!"
46
int sample() {

server/testdata/04/final.fsh.merge

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
#version 120
2+
#extension GL_GOOGLE_cpp_style_line_directive : enable
3+
#line 2 "!!"
24

35
#line 1 "!!"
46
#line 1 "!!"

server/testdata/05/final.fsh.merge

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
#version 120
2+
#extension GL_GOOGLE_cpp_style_line_directive : enable
3+
#line 2 "!!"
24

35
#line 1 "!!"
46
float test() {

0 commit comments

Comments
 (0)