Skip to content

Commit a368ff6

Browse files
author
Gary Frost
committed
Hat more vec and mat func mappings
1 parent b1de3eb commit a368ff6

22 files changed

Lines changed: 228 additions & 639 deletions

hat/core/src/main/java/hat/codebuilders/C99VecAndMatHandler.java

Lines changed: 59 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -149,8 +149,13 @@ public static <T extends C99HATKernelBuilder<T>> void handleInvoke(C99HATKernelB
149149
bldr.commaSpaceSeparated(invoke.operandsAsResults(), operand -> bldr.recurse(operand.op()))
150150
);
151151
} else {
152-
// We have to catch vecn.mul(vecn, matn)
153-
if (invoke.named("mul")
152+
if (invoke.named("mod")) {
153+
bldr.id("vec2_mod_vec2_f32").paren(_ ->
154+
bldr.commaSpaceSeparated(invoke.operandsAsResults(), operand -> bldr.recurse(operand.op())));
155+
}else if (invoke.named("reflect")) {
156+
bldr.id("vec3_reflect_vec3_vec3").paren(_ ->
157+
bldr.commaSpaceSeparated(invoke.operandsAsResults(), operand -> bldr.recurse(operand.op())));
158+
}else if (invoke.named("mul")
154159
&& invoke.operandCount() == 2
155160
&& invoke.resultFromOperandNOrNull(1) instanceof Op.Result r
156161
&& r.type() instanceof ClassType cte
@@ -186,6 +191,10 @@ public static <T extends C99HATKernelBuilder<T>> void handleInvoke(C99HATKernelB
186191
bldr.paren(_ -> bldr.type(invoke.name())).brace(_ ->
187192
bldr.commaSpaceSeparated(invoke.operandsAsResults(), operand -> bldr.recurse(operand.op()))
188193
);
194+
}else if (invoke.named("mul")) {
195+
String matType = clName(bldr.scopedCodeBuilderContext().lookup(),(JavaType)invoke.returnType());
196+
// for opencl we can turn these into expressions. So vec3.mul(l,r) -> (l * r)
197+
bldr.id(matType+"_mul_"+matType+"_"+matType).paren(_-> bldr.commaSpaceSeparated(invoke.operandsAsResults(), operand -> bldr.recurse(operand.op())));
189198
} else {
190199
bldr.lineComment("other call through mat !");
191200
bldr.recurse(invoke.opFromFirstOperandOrNull()).dot().id(invoke.name());
@@ -261,13 +270,61 @@ record NamedVecShape(String name, IfaceValue.vec.Shape shape) {
261270
l.z*r._20+l.z*r._21+l.z*r._22
262271
""")
263272
).semicolon());
273+
274+
List.of("mat2", "mat3").forEach(matType->
275+
builder.func(
276+
_->builder.type(matType),
277+
matType+"_mul_"+matType+"_"+matType,
278+
_->builder.type(matType).sp().id("l").csp().type(matType).sp().id("r"),
279+
_->builder.returnKeyword().sp().paren(_->builder.type(matType)).brace(_->
280+
builder.either(matType.equals("mat2"),
281+
_-> builder.preformatted("""
282+
l._00*r._00,l._01*r._01, l._10*r._10,l._11*r._11
283+
"""),
284+
_-> builder.preformatted("""
285+
l._00*r._00,l._01*r._01,l._02*r._02,
286+
l._10*r._10,l._11*r._11,l._12*r._12,
287+
l._20*r._20,l._21*r._21,l._22*r._22
288+
"""))
289+
).semicolon())
290+
);
291+
builder.func(
292+
_->builder.type("vec2"),
293+
"vec2_mul_mat2_vec2",
294+
_->builder.type("mat2").sp().id("l").csp().type("vec2").sp().id("r"),
295+
_->builder.returnKeyword().sp().paren(_->builder.type("vec2")).paren(_->
296+
builder.preformatted("""
297+
l._00*r.x+l._01*r.y,
298+
l._10*r.x+l._11*r.y
299+
""")
300+
).semicolon());
264301
builder.func(
265302
_->builder.type("float"),
266303
"f32_mod_f32_f32",
267304
_->builder.type("float").sp().id("l").csp().type("float").sp().id("r"),
268305
_->builder.returnKeyword().sp().id("l").sp().minus().id("r").sp().mul().sp().id("floor").paren(_->
269306
builder.id("l").div().id("r")).semicolon());
270307

308+
builder.func(
309+
_->builder.type("vec2"),
310+
"vec2_mod_vec2_f32",
311+
_->builder.type("vec2").sp().id("l").csp().type("float").sp().id("r"),
312+
_->builder.returnKeyword().sp().id("l").sp().minus().id("r").sp().mul().sp().id("floor").paren(_->
313+
builder.id("l").div().id("r")).semicolon());
314+
315+
builder.func(
316+
_->builder.type("vec3"),
317+
"vec3_reflect_vec3_vec3",
318+
_->builder.type("vec3").sp().id("l").csp().type("vec3").sp().id("r"),
319+
_->builder.returnKeyword().sp().id("l").sp().minus().id("r").sp().mul().sp().id("l").sp().mul().floatConst(2)
320+
//.paren(_->
321+
//builder.preformatted(" return vec2.sub(l, mul(mul(r, l), 2.0f));")
322+
.semicolon());
323+
324+
// static vec2 reflect(vec2 l, vec2 r){
325+
// return vec2.sub(l, mul(mul(r, l), 2.0f));
326+
// }
327+
271328
// " // static float mod(float x, float y){return x - y * floor(x/y);}"
272329
}
273330
}

hat/examples/shade/src/main/java/shade/Main.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ public static void update( Accelerator acc, Uniforms uniforms, F32Array f32Arra
6767

6868
static void main(String[] args) {
6969
var acc = new Accelerator(MethodHandles.lookup(), Backend.FIRST);
70-
var shader = ShaderViewer.of(acc, JuliaShader.class,1024, 1024, true);
70+
var shader = ShaderViewer.of(acc, JuliaShader.class,1024, 1024);
7171
shader.startLoop((uniforms, f32Array) -> update( acc, uniforms, f32Array, shader.view.getWidth(), shader.view.getWidth()));
7272
}
7373
}

hat/examples/shade/src/main/java/shade/ShaderViewer.java

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -72,11 +72,12 @@ public interface Shader{
7272
private int width;
7373
private int height;
7474
private boolean useHat;
75+
private boolean showFps;
7576
private Class shaderClass;
7677
private Method mainImageMethod;
7778

7879

79-
ShaderViewer(Accelerator acc, Class shaderClass, int width, int height, boolean useHat) {
80+
ShaderViewer(Accelerator acc, Class shaderClass, int width, int height, boolean useHat, boolean showFps) {
8081
this.acc = acc;
8182
this.shaderClass = shaderClass;
8283
try {
@@ -89,6 +90,7 @@ public interface Shader{
8990
this.width = width;
9091
this.height = height;
9192
this.useHat = useHat;
93+
this.showFps = showFps;
9294
this.view = new JComponent() {
9395
};
9496
this.view.setSize(width, height);
@@ -141,25 +143,25 @@ public void startLoop(Shader shader) {
141143
shader.update(uniforms, f32Array);
142144
}else {
143145
IntStream.range(0, width * height).parallel().forEach(idx -> {
144-
vec2 fragCoord = vec2.vec2((float) (idx % width), (float) (idx / width));
145-
vec4 fragColor = null;
146+
vec2 fragCoord = vec2.vec2((float) (idx % width), (float) (height -(idx / width)));
146147
try {
147-
fragColor = (vec4) mainImageMethod.invoke(null,uniforms, vec4.vec4(1f), fragCoord);
148-
} catch (IllegalAccessException e) {
149-
throw new RuntimeException(e);
150-
} catch (InvocationTargetException e) {
148+
vec4 fragColor = (vec4) mainImageMethod.invoke(null,uniforms, vec4.vec4(1f), fragCoord);
149+
f32Array.array(idx * 3, fragColor.x());
150+
f32Array.array(idx * 3 + 1, fragColor.y());
151+
f32Array.array(idx * 3 + 2, fragColor.z());
152+
} catch (IllegalAccessException | InvocationTargetException e) {
151153
throw new RuntimeException(e);
152154
}
153-
f32Array.array(idx * 3, fragColor.x());
154-
f32Array.array(idx * 3 + 1, fragColor.y());
155-
f32Array.array(idx * 3 + 2, fragColor.z());
156155
});
157156
}
158157
f32Array.copyTo(f32x3Arr);
159158
uniforms.iFrame(uniforms.iFrame()+1);
160159
long endNs = System.nanoTime();
161-
// System.out.println((endNs - startNs) / 1000000);
162-
160+
long shaderMs = (endNs - startNs) / 1000000;
161+
// System.out.println("Shader time ms= "+shaderMs);
162+
if (showFps) {
163+
System.out.println("Using HAT = "+useHat+" FPS = " + (1000f / shaderMs));
164+
}
163165
Graphics2D volatileGraphics2D = volatileImage.createGraphics();
164166
volatileGraphics2D.drawImage(buffer, 0, 0, null);
165167
volatileGraphics2D.dispose();
@@ -176,8 +178,8 @@ public void startLoop(Shader shader) {
176178
}).start();
177179
}
178180

179-
public static ShaderViewer of(Accelerator acc, Class<?> shaderClass, int width, int height, boolean useHat){
180-
var shader = new ShaderViewer(acc,shaderClass, width,height, useHat);
181+
public static ShaderViewer of(Accelerator acc, Class<?> shaderClass, int width, int height){
182+
var shader = new ShaderViewer(acc,shaderClass, width,height, Boolean.getBoolean("useHAT"), Boolean.getBoolean("showFPS"));
181183
JFrame frame = new JFrame(shaderClass.getSimpleName());
182184
frame.setSize(shader.view.getWidth(),shader.view.getHeight());
183185
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

hat/examples/shade/src/main/java/shade/shaders/AcesShader.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,8 @@ public static vec3 aces_tonemap(vec3 color) {
138138
@Reflect
139139
public static void penumbra(@MappableIface.RO KernelContext kc, @MappableIface.RO Uniforms uniforms, @MappableIface.RW F32Array f32Array) {
140140
int width = (int) uniforms.iResolution().x();
141-
var fragColor = mainImage(uniforms, vec4.vec4(0f), vec2.vec2((float)(kc.gix % width), (float)(kc.gix / width)));
141+
int height = (int) uniforms.iResolution().y();
142+
var fragColor = mainImage(uniforms, vec4.vec4(0f), vec2.vec2((float)(kc.gix % width), (float)(height-(kc.gix / width))));
142143
f32Array.array(kc.gix * 3, fragColor.x());
143144
f32Array.array(kc.gix * 3+1, fragColor.y());
144145
f32Array.array(kc.gix * 3+2, fragColor.z());
@@ -155,7 +156,7 @@ public static void update( Accelerator acc, Uniforms uniforms, F32Array f32Arra
155156

156157
static void main(String[] args) {
157158
var acc = new Accelerator(MethodHandles.lookup(), Backend.FIRST);
158-
var shader = ShaderViewer.of(acc, AcesShader.class,1024, 1024, false);
159+
var shader = ShaderViewer.of(acc, AcesShader.class,1024, 1024);
159160
shader.startLoop((uniforms, f32Array) -> update( acc, uniforms, f32Array, shader.view.getWidth(), shader.view.getWidth()));
160161
}
161162
}

hat/examples/shade/src/main/java/shade/shaders/AnimShader.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,8 @@ public class AnimShader {
162162
@Reflect
163163
public static void penumbra(@MappableIface.RO KernelContext kc, @MappableIface.RO Uniforms uniforms, @MappableIface.RW F32Array f32Array) {
164164
int width = (int) uniforms.iResolution().x();
165-
var fragColor = mainImage(uniforms, vec4.vec4(0f), vec2.vec2((float)(kc.gix % width), (float)(kc.gix / width)));
165+
int height = (int) uniforms.iResolution().y();
166+
var fragColor = mainImage(uniforms, vec4.vec4(0f), vec2.vec2((float)(kc.gix % width), (float)(height-(kc.gix / width))));
166167
f32Array.array(kc.gix * 3, fragColor.x());
167168
f32Array.array(kc.gix * 3+1, fragColor.y());
168169
f32Array.array(kc.gix * 3+2, fragColor.z());
@@ -179,7 +180,7 @@ public static void update( Accelerator acc, Uniforms uniforms, F32Array f32Arra
179180

180181
static void main(String[] args) {
181182
var acc = new Accelerator(MethodHandles.lookup(), Backend.FIRST);
182-
var shader = ShaderViewer.of(acc, AnimShader.class,1024, 1024, true);
183+
var shader = ShaderViewer.of(acc, AnimShader.class,1024, 1024);
183184
shader.startLoop((uniforms, f32Array) -> update( acc, uniforms, f32Array, shader.view.getWidth(), shader.view.getWidth()));
184185
}
185186
}

hat/examples/shade/src/main/java/shade/shaders/GroovyShader.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,14 +87,14 @@ public static vec4 createPixel(vec2 fres, float ftime, vec2 fmouse, vec2 fragCoo
8787

8888
@Reflect public static vec4 mainImage(Uniforms uniforms, vec4 fragColor, vec2 fragCoord) {
8989
return createPixel(vec2.vec2(uniforms.iResolution().x(),uniforms.iResolution().y()),uniforms.iTime(),vec2.vec2(uniforms.iMouse().x(),uniforms.iMouse().y()),fragCoord);
90-
9190
}
9291

9392

9493
@Reflect
9594
public static void penumbra(@MappableIface.RO KernelContext kc, @MappableIface.RO Uniforms uniforms, @MappableIface.RW F32Array f32Array) {
9695
int width = (int) uniforms.iResolution().x();
97-
var fragColor = mainImage(uniforms, vec4.vec4(0f), vec2.vec2((float)(kc.gix % width), (float)(kc.gix / width)));
96+
int height = (int) uniforms.iResolution().y();
97+
var fragColor = mainImage(uniforms, vec4.vec4(0f), vec2.vec2((float)(kc.gix % width), (float)(height-(kc.gix / width))));
9898
f32Array.array(kc.gix * 3, fragColor.x());
9999
f32Array.array(kc.gix * 3+1, fragColor.y());
100100
f32Array.array(kc.gix * 3+2, fragColor.z());
@@ -111,7 +111,7 @@ public static void update( Accelerator acc, Uniforms uniforms, F32Array f32Arra
111111

112112
static void main(String[] args) {
113113
var acc = new Accelerator(MethodHandles.lookup(), Backend.FIRST);
114-
var shader = ShaderViewer.of(acc, GroovyShader.class,1024, 1024, true);
114+
var shader = ShaderViewer.of(acc, GroovyShader.class,1024, 1024);
115115
shader.startLoop((uniforms, f32Array) -> update( acc, uniforms, f32Array, shader.view.getWidth(), shader.view.getWidth()));
116116
}
117117
}

hat/examples/shade/src/main/java/shade/shaders/HelloWorldShader.java

Lines changed: 0 additions & 83 deletions
This file was deleted.

hat/examples/shade/src/main/java/shade/shaders/IntroShader.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,8 @@ public static float square(vec2 r, vec2 bottomLeft, float side) {
254254
@Reflect
255255
public static void penumbra(@MappableIface.RO KernelContext kc, @MappableIface.RO Uniforms uniforms, @MappableIface.RW F32Array f32Array) {
256256
int width = (int) uniforms.iResolution().x();
257-
var fragColor = mainImage(uniforms, vec4.vec4(0f), vec2.vec2((float)(kc.gix % width), (float)(kc.gix / width)));
257+
int height = (int) uniforms.iResolution().y();
258+
var fragColor = mainImage(uniforms, vec4.vec4(0f), vec2.vec2((float)(kc.gix % width), (float)(height-(kc.gix / width))));
258259
f32Array.array(kc.gix * 3, fragColor.x());
259260
f32Array.array(kc.gix * 3+1, fragColor.y());
260261
f32Array.array(kc.gix * 3+2, fragColor.z());
@@ -271,7 +272,7 @@ public static void update( Accelerator acc, Uniforms uniforms, F32Array f32Arra
271272

272273
static void main(String[] args) {
273274
var acc = new Accelerator(MethodHandles.lookup(), Backend.FIRST);
274-
var shader = ShaderViewer.of(acc, IntroShader.class,1024, 1024, true);
275+
var shader = ShaderViewer.of(acc, IntroShader.class,1024, 1024);
275276
shader.startLoop((uniforms, f32Array) -> update( acc, uniforms, f32Array, shader.view.getWidth(), shader.view.getWidth()));
276277
}
277278
}

hat/examples/shade/src/main/java/shade/shaders/JuliaShader.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,8 @@ public static float calc(vec2 fres , float ftime, vec2 p) {
211211
@Reflect
212212
public static void penumbra(@MappableIface.RO KernelContext kc, @MappableIface.RO Uniforms uniforms, @MappableIface.RW F32Array f32Array) {
213213
int width = (int) uniforms.iResolution().x();
214-
var fragColor = mainImage(uniforms, vec4.vec4(0f), vec2.vec2((float)(kc.gix % width), (float)(kc.gix / width)));
214+
int height = (int) uniforms.iResolution().y();
215+
var fragColor = mainImage(uniforms, vec4.vec4(0f), vec2.vec2((float)(kc.gix % width), (float)(height-(kc.gix / width))));
215216
f32Array.array(kc.gix * 3, fragColor.x());
216217
f32Array.array(kc.gix * 3+1, fragColor.y());
217218
f32Array.array(kc.gix * 3+2, fragColor.z());
@@ -228,7 +229,7 @@ public static void update( Accelerator acc, Uniforms uniforms, F32Array f32Arra
228229

229230
static void main(String[] args) {
230231
var acc = new Accelerator(MethodHandles.lookup(), Backend.FIRST);
231-
var shader = ShaderViewer.of(acc, JuliaShader.class,1024, 1024, true);
232+
var shader = ShaderViewer.of(acc, JuliaShader.class,1024, 1024);
232233
shader.startLoop((uniforms, f32Array) -> update( acc, uniforms, f32Array, shader.view.getWidth(), shader.view.getWidth()));
233234
}
234235
}

0 commit comments

Comments
 (0)