| … | 65 unchanged lines hidden |
| 66 |
66 |
|
end |
| 67 |
67 |
|
` |
| 68 |
68 |
|
|
|
69 |
+ |
BLUE_FRAGMENT_SHADER :: ` |
|
70 |
+ |
fragment main |
|
71 |
+ |
out color: vec4 |
|
72 |
+ |
do |
|
73 |
+ |
color = vec4(64.0 / 255.0, 64.0 / 255.0, 240.0 / 255.0, 1.0) |
|
74 |
+ |
end |
|
75 |
+ |
` |
|
76 |
+ |
|
|
77 |
+ |
SAMPLE_FRAGMENT_SHADER :: ` |
|
78 |
+ |
group frame = 0 |
|
79 |
+ |
@binding(0) texture offscreen_color: sampler2D |
|
80 |
+ |
end |
|
81 |
+ |
|
|
82 |
+ |
fragment main |
|
83 |
+ |
in uv: vec2 |
|
84 |
+ |
out color: vec4 |
|
85 |
+ |
do |
|
86 |
+ |
color = sample(offscreen_color, uv) |
|
87 |
+ |
end |
|
88 |
+ |
` |
|
89 |
+ |
|
| 69 |
90 |
|
quad_vertices :: proc(x0, y0, x1, y1: f32) -> [6]resource.Mesh_Vertex_PNU { |
| 70 |
91 |
|
n := [3]f32{0, 0, 1} |
| 71 |
92 |
|
return { |
| … | 45 unchanged lines hidden |
| 117 |
138 |
|
indirect_geometry: ir.Resource_Handle, |
| 118 |
139 |
|
instance_data: ir.Resource_Handle, |
| 119 |
140 |
|
indirect_args: ir.Resource_Handle, |
|
141 |
+ |
offscreen_geometry: ir.Resource_Handle, |
|
142 |
+ |
sample_geometry: ir.Resource_Handle, |
| 120 |
143 |
|
) { |
| 121 |
144 |
|
frame = ir.init_frame_ir() |
| 122 |
145 |
|
color = ir.add_texture(&frame, "proof-color", WIDTH, HEIGHT, .R8G8B8A8_UNORM, {.Color_Attachment, .Sampled}, .Transient) |
| 123 |
146 |
|
secondary := ir.add_texture(&frame, "mrt-secondary", WIDTH, HEIGHT, .R8G8B8A8_UNORM, {.Color_Attachment, .Sampled}, .Transient) |
|
147 |
+ |
offscreen := ir.add_texture(&frame, "offscreen-sampled-proof", WIDTH, HEIGHT, .R8G8B8A8_UNORM, {.Color_Attachment, .Sampled}, .Transient) |
|
148 |
+ |
sampler := ir.add_sampler(&frame, "nearest-sampler", { |
|
149 |
+ |
mag_filter = .Nearest, |
|
150 |
+ |
min_filter = .Nearest, |
|
151 |
+ |
address_mode_u = .Clamp_To_Edge, |
|
152 |
+ |
address_mode_v = .Clamp_To_Edge, |
|
153 |
+ |
mipmap_mode = .Nearest, |
|
154 |
+ |
}, .Transient) |
| 124 |
155 |
|
mrt_geometry = ir.add_buffer(&frame, "mrt-vertices", u64(6 * size_of(resource.Mesh_Vertex_PNU)), {.Vertex}, {.Host_Visible, .Host_Coherent}, .Transient) |
| 125 |
156 |
|
indirect_geometry = ir.add_buffer(&frame, "indirect-vertices", u64(6 * size_of(resource.Mesh_Vertex_PNU)), {.Vertex}, {.Host_Visible, .Host_Coherent}, .Transient) |
| 126 |
157 |
|
instance_data = ir.add_buffer(&frame, "instances", u64(size_of(Instance_PNUC)), {.Vertex}, {.Host_Visible, .Host_Coherent}, .Transient) |
| 127 |
158 |
|
indirect_args = ir.add_buffer(&frame, "indirect-args", u64(size_of(bk.Indirect_Draw_Args)), {.Indirect_Argument}, {.Host_Visible, .Host_Coherent}, .Transient) |
|
159 |
+ |
offscreen_geometry = ir.add_buffer(&frame, "offscreen-vertices", u64(6 * size_of(resource.Mesh_Vertex_PNU)), {.Vertex}, {.Host_Visible, .Host_Coherent}, .Transient) |
|
160 |
+ |
sample_geometry = ir.add_buffer(&frame, "sample-vertices", u64(6 * size_of(resource.Mesh_Vertex_PNU)), {.Vertex}, {.Host_Visible, .Host_Coherent}, .Transient) |
| 128 |
161 |
|
|
|
162 |
+ |
vs := ir.add_shader_source(&frame, "parity_backend_features.vert", .Vertex, VERTEX_SHADER) |
|
163 |
+ |
blue_fs := ir.add_shader_source(&frame, "parity_backend_features_blue.frag", .Fragment, BLUE_FRAGMENT_SHADER) |
|
164 |
+ |
offscreen_pass_desc := ir.Pass_Desc{kind = .Render, name = "write-offscreen-sampled"} |
|
165 |
+ |
_ = ir.pass_add_color_target(&offscreen_pass_desc, ir.make_color_target(offscreen, .R8G8B8A8_UNORM, .Clear, .Store, {16.0 / 255.0, 16.0 / 255.0, 24.0 / 255.0, 1})) |
|
166 |
+ |
ir.pass_set_viewport(&offscreen_pass_desc, {x = 0, y = 0, width = f32(WIDTH), height = f32(HEIGHT), min_depth = 0, max_depth = 1}) |
|
167 |
+ |
ir.pass_set_scissor(&offscreen_pass_desc, {x = 0, y = 0, width = WIDTH, height = HEIGHT}) |
|
168 |
+ |
offscreen_pass := ir.add_pass(&frame, offscreen_pass_desc) |
|
169 |
+ |
offscreen_target := ir.add_target(&frame, {kind = .Offscreen, name = "offscreen-sampled-target", width = WIDTH, height = HEIGHT, pass = offscreen_pass, color_format = .R8G8B8A8_UNORM, color_resource = offscreen}) |
|
170 |
+ |
offscreen_state := ir.default_graphics_pipeline_state() |
|
171 |
+ |
offscreen_state.vertex_shader = vs |
|
172 |
+ |
offscreen_state.fragment_shader = blue_fs |
|
173 |
+ |
offscreen_pipeline := ir.add_graphics_pipeline(&frame, "offscreen-blue", offscreen_state) |
|
174 |
+ |
_ = ir.add_draw_packet(&frame, offscreen_pass, offscreen_pipeline, .Vertex_Stream, { |
|
175 |
+ |
target = offscreen_target, |
|
176 |
+ |
geometry = {kind = .Vertex_Stream, resource = offscreen_geometry, vertex_count = 6}, |
|
177 |
+ |
order = .Strict, |
|
178 |
+ |
}) |
|
179 |
+ |
|
| 129 |
180 |
|
pass_desc := ir.Pass_Desc{kind = .Render, name = "backend-feature-proof"} |
| 130 |
181 |
|
_ = ir.pass_add_color_target(&pass_desc, ir.make_color_target(color, .R8G8B8A8_UNORM, .Clear, .Store, {16.0 / 255.0, 16.0 / 255.0, 24.0 / 255.0, 1})) |
| 131 |
182 |
|
_ = ir.pass_add_color_target(&pass_desc, ir.make_color_target(secondary, .R8G8B8A8_UNORM, .Clear, .Store, {0, 0, 0, 1})) |
| … | 2 unchanged lines hidden |
| 134 |
185 |
|
pass := ir.add_pass(&frame, pass_desc) |
| 135 |
186 |
|
target := ir.add_target(&frame, {kind = .Offscreen, name = "proof-target", width = WIDTH, height = HEIGHT, pass = pass, color_format = .R8G8B8A8_UNORM, color_resource = color}) |
| 136 |
187 |
|
|
| 137 |
|
- |
vs := ir.add_shader_source(&frame, "parity_backend_features.vert", .Vertex, VERTEX_SHADER) |
| 138 |
188 |
|
red_fs := ir.add_shader_source(&frame, "parity_backend_features_red.frag", .Fragment, RED_FRAGMENT_SHADER) |
| 139 |
189 |
|
red_state := ir.default_graphics_pipeline_state() |
| 140 |
190 |
|
red_state.vertex_shader = vs |
| … | 24 unchanged lines hidden |
| 165 |
215 |
|
}, |
| 166 |
216 |
|
order = .Strict, |
| 167 |
217 |
|
}) |
|
218 |
+ |
layout_desc := ir.make_descriptor_set_layout("offscreen-sampled-layout") |
|
219 |
+ |
_ = ir.descriptor_layout_add_binding(&layout_desc, 0, .Combined_Image_Sampler, 1, {.Fragment}) |
|
220 |
+ |
layout := ir.add_descriptor_set_layout(&frame, layout_desc) |
|
221 |
+ |
set_desc := ir.make_descriptor_set("offscreen-sampled-set", layout) |
|
222 |
+ |
_ = ir.descriptor_set_bind_texture_sampler(&set_desc, 0, offscreen, sampler) |
|
223 |
+ |
set := ir.add_descriptor_set(&frame, set_desc) |
|
224 |
+ |
sample_fs := ir.add_shader_source(&frame, "parity_backend_features_sample.frag", .Fragment, SAMPLE_FRAGMENT_SHADER) |
|
225 |
+ |
sample_state := ir.default_graphics_pipeline_state() |
|
226 |
+ |
sample_state.vertex_shader = vs |
|
227 |
+ |
sample_state.fragment_shader = sample_fs |
|
228 |
+ |
sample_pipeline_desc := ir.Pipeline_Desc { |
|
229 |
+ |
kind = .Graphics, |
|
230 |
+ |
name = "sample-offscreen", |
|
231 |
+ |
graphics = sample_state, |
|
232 |
+ |
} |
|
233 |
+ |
_ = ir.pipeline_add_descriptor_layout(&sample_pipeline_desc, layout) |
|
234 |
+ |
sample_pipeline := ir.add_pipeline(&frame, sample_pipeline_desc) |
|
235 |
+ |
material := ir.add_material(&frame, {name = "sample-offscreen", pipeline = sample_pipeline, descriptor_set = set}) |
|
236 |
+ |
_ = ir.add_draw_packet(&frame, pass, sample_pipeline, .Vertex_Stream, { |
|
237 |
+ |
target = target, |
|
238 |
+ |
material = material, |
|
239 |
+ |
geometry = {kind = .Vertex_Stream, resource = sample_geometry, vertex_count = 6}, |
|
240 |
+ |
order = .Strict, |
|
241 |
+ |
sort_key = 2, |
|
242 |
+ |
}) |
| 168 |
243 |
|
return |
| 169 |
244 |
|
} |
| 170 |
245 |
|
|
| … | 9 unchanged lines hidden |
| 180 |
255 |
|
fail("parity_backend_features: backend readback unsupported") |
| 181 |
256 |
|
} |
| 182 |
257 |
|
|
| 183 |
|
- |
frame, color, mrt_geometry, indirect_geometry, instance_data, indirect_args := make_frame() |
|
258 |
+ |
frame, color, mrt_geometry, indirect_geometry, instance_data, indirect_args, offscreen_geometry, sample_geometry := make_frame() |
| 184 |
259 |
|
defer ir.destroy_frame_ir(&frame) |
| 185 |
260 |
|
exec := compiler.init_execution_state(backend) |
| 186 |
261 |
|
defer compiler.destroy_execution_state(&exec) |
| … | 4 unchanged lines hidden |
| 191 |
266 |
|
indirect_buffer, indirect_ok := compiler.prepared_buffer(&exec, indirect_geometry) |
| 192 |
267 |
|
instance_buffer, instance_ok := compiler.prepared_buffer(&exec, instance_data) |
| 193 |
268 |
|
args_buffer, args_ok := compiler.prepared_buffer(&exec, indirect_args) |
| 194 |
|
- |
if !mrt_ok || !indirect_ok || !instance_ok || !args_ok { |
|
269 |
+ |
offscreen_buffer, offscreen_ok := compiler.prepared_buffer(&exec, offscreen_geometry) |
|
270 |
+ |
sample_buffer, sample_ok := compiler.prepared_buffer(&exec, sample_geometry) |
|
271 |
+ |
if !mrt_ok || !indirect_ok || !instance_ok || !args_ok || !offscreen_ok || !sample_ok { |
| 195 |
272 |
|
fail("parity_backend_features: failed to resolve prepared buffers") |
| 196 |
273 |
|
} |
| 197 |
274 |
|
mrt_vertices := quad_vertices(-0.85, -0.5, -0.35, 0.5) |
| 198 |
275 |
|
indirect_vertices := quad_vertices(-0.25, -0.5, 0.25, 0.5) |
|
276 |
+ |
offscreen_vertices := quad_vertices(-1, -1, 1, 1) |
|
277 |
+ |
sample_vertices := quad_vertices(0.35, -0.5, 0.85, 0.5) |
| 199 |
278 |
|
instance := Instance_PNUC{normal = {0, 0, 1}, color = {64.0 / 255.0, 240.0 / 255.0, 64.0 / 255.0, 1}} |
| 200 |
279 |
|
args := bk.Indirect_Draw_Args{vertex_count = 6, instance_count = 1} |
| 201 |
280 |
|
if !write_bytes(backend, mrt_buffer, raw_data(mrt_vertices[:]), len(mrt_vertices) * size_of(resource.Mesh_Vertex_PNU)) || |
| 202 |
281 |
|
!write_bytes(backend, indirect_buffer, raw_data(indirect_vertices[:]), len(indirect_vertices) * size_of(resource.Mesh_Vertex_PNU)) || |
| 203 |
282 |
|
!write_bytes(backend, instance_buffer, &instance, size_of(Instance_PNUC)) || |
| 204 |
|
- |
!write_bytes(backend, args_buffer, &args, size_of(bk.Indirect_Draw_Args)) { |
|
283 |
+ |
!write_bytes(backend, args_buffer, &args, size_of(bk.Indirect_Draw_Args)) || |
|
284 |
+ |
!write_bytes(backend, offscreen_buffer, raw_data(offscreen_vertices[:]), len(offscreen_vertices) * size_of(resource.Mesh_Vertex_PNU)) || |
|
285 |
+ |
!write_bytes(backend, sample_buffer, raw_data(sample_vertices[:]), len(sample_vertices) * size_of(resource.Mesh_Vertex_PNU)) { |
| 205 |
286 |
|
fail("parity_backend_features: failed to upload proof buffers") |
| 206 |
287 |
|
} |
| 207 |
288 |
|
if !compiler.execute_prepared_planned_frame(&exec, &frame, {0, 0, 0, 1}) { |
| … | 20 unchanged lines hidden |