Skip to content

Commit a41a3d3

Browse files
committed
Vulkan create shadermodule
1 parent 286c146 commit a41a3d3

File tree

6 files changed

+71
-71
lines changed

6 files changed

+71
-71
lines changed

graphics-by-opengl-j2se/src/main/java/com/nucleus/vulkan/GLSLCompiler.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
import com.nucleus.io.StreamUtils;
1414
import com.nucleus.spirv.SpirvBinary;
1515
import com.nucleus.spirv.SpirvBinary.SpirvStream;
16-
import com.nucleus.vulkan.structs.ShaderModuleCreateInfo.Type;
16+
import com.nucleus.vulkan.shader.VulkanShaderBinary.Type;
1717

1818
/**
1919
* Used to compile GLSL to SPIR-V in runtime.

graphics-by-opengl-j2se/src/main/java/com/nucleus/vulkan/Vulkan10Wrapper.java

+11-1
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,16 @@
1010
import com.nucleus.vulkan.Vulkan10.PresentModeKHR;
1111
import com.nucleus.vulkan.Vulkan10.SurfaceFormat;
1212
import com.nucleus.vulkan.VulkanWrapper.VulkanDeviceSelector;
13+
import com.nucleus.vulkan.shader.VulkanShaderBinary;
1314
import com.nucleus.vulkan.structs.Extent2D;
1415
import com.nucleus.vulkan.structs.ImageView;
1516
import com.nucleus.vulkan.structs.ImageViewCreateInfo;
1617
import com.nucleus.vulkan.structs.PhysicalDeviceMemoryProperties;
18+
import com.nucleus.vulkan.structs.PhysicalDeviceProperties.PhysicalDeviceType;
1719
import com.nucleus.vulkan.structs.QueueFamilyProperties;
1820
import com.nucleus.vulkan.structs.QueueFamilyProperties.QueueFlagBits;
21+
import com.nucleus.vulkan.structs.ShaderModule;
1922
import com.nucleus.vulkan.structs.SwapChain;
20-
import com.nucleus.vulkan.structs.PhysicalDeviceProperties.PhysicalDeviceType;
2123

2224
/**
2325
* Wrapper for Vulkan version 1.0 funtionality
@@ -168,6 +170,14 @@ protected abstract SwapChain createSwapChain(PhysicalDevice device, SurfaceForma
168170
*/
169171
protected abstract PhysicalDeviceMemoryProperties getMemoryProperties(PhysicalDevice device);
170172

173+
/**
174+
* Creates the shadermodule
175+
*
176+
* @param binary
177+
* @return
178+
*/
179+
protected abstract ShaderModule createShaderModule(VulkanShaderBinary binary);
180+
171181
@Override
172182
public PhysicalDevice selectDevice(PhysicalDevice[] devices) {
173183
ArrayList<PhysicalDevice> validDevices = new ArrayList<>();

graphics-by-opengl-j2se/src/main/java/com/nucleus/vulkan/VulkanGraphicsPipeline.java

+28-9
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,23 @@
1717
import com.nucleus.shader.BlockBuffer;
1818
import com.nucleus.shader.GraphicsShader;
1919
import com.nucleus.shader.Shader.Categorizer;
20+
import com.nucleus.shader.Shader.ProgramType;
2021
import com.nucleus.shader.Shader.ShaderType;
2122
import com.nucleus.shader.ShaderBinary;
2223
import com.nucleus.shader.ShaderVariable;
2324
import com.nucleus.shader.ShaderVariable.VariableType;
2425
import com.nucleus.shader.VariableIndexer;
25-
import com.nucleus.vulkan.structs.ShaderModuleCreateInfo;
26-
import com.nucleus.vulkan.structs.ShaderModuleCreateInfo.Type;
26+
import com.nucleus.vulkan.shader.VulkanShaderBinary;
27+
import com.nucleus.vulkan.shader.VulkanShaderBinary.Type;
28+
import com.nucleus.vulkan.structs.ShaderModule;
2729

2830
public class VulkanGraphicsPipeline implements GraphicsPipeline<ShaderBinary> {
2931

3032
private Vulkan10Wrapper vulkan;
33+
private VulkanShaderBinary vertex;
34+
private VulkanShaderBinary fragment;
35+
private ShaderModule vertexModule;
36+
private ShaderModule fragmentModule;
3137

3238
public VulkanGraphicsPipeline(Vulkan10Wrapper vulkan) {
3339
if (vulkan == null) {
@@ -113,27 +119,32 @@ public void uploadAttributes(FloatBuffer attributeData, ShaderVariable[] activeA
113119
@Override
114120
public ShaderBinary getShaderSource(Renderers version, Categorizer function, ShaderType type) {
115121
String sourceNameVersion = ShaderBinary.getSourceNameVersion(version);
122+
VulkanShaderBinary spirv = null;
116123
switch (type) {
117124
case VERTEX:
118-
return new ShaderModuleCreateInfo(ShaderBinary.PROGRAM_DIRECTORY + sourceNameVersion,
125+
spirv = new VulkanShaderBinary(ShaderBinary.PROGRAM_DIRECTORY + sourceNameVersion,
119126
function.getShaderSourceName(type), Type.VERTEX.fileName,
120127
type);
128+
break;
121129
case FRAGMENT:
122-
return new ShaderModuleCreateInfo(ShaderBinary.PROGRAM_DIRECTORY + sourceNameVersion,
130+
spirv = new VulkanShaderBinary(ShaderBinary.PROGRAM_DIRECTORY + sourceNameVersion,
123131
function.getShaderSourceName(type), Type.FRAGMENT.fileName,
124132
type);
133+
break;
125134
case COMPUTE:
126-
return new ShaderModuleCreateInfo(ShaderBinary.PROGRAM_DIRECTORY + sourceNameVersion,
135+
spirv = new VulkanShaderBinary(ShaderBinary.PROGRAM_DIRECTORY + sourceNameVersion,
127136
function.getShaderSourceName(type), Type.COMPUTE.fileName,
128137
type);
138+
break;
129139
case GEOMETRY:
130-
return new ShaderModuleCreateInfo(ShaderBinary.PROGRAM_DIRECTORY + sourceNameVersion,
140+
spirv = new VulkanShaderBinary(ShaderBinary.PROGRAM_DIRECTORY + sourceNameVersion,
131141
function.getShaderSourceName(type), Type.GEOMETRY.fileName,
132142
type);
133-
143+
break;
134144
default:
135145
throw new IllegalArgumentException("Not implemented for type: " + type);
136146
}
147+
return spirv;
137148
}
138149

139150
@Override
@@ -162,11 +173,19 @@ public VariableIndexer getLocationMapping() {
162173

163174
@Override
164175
public void compile(NucleusRenderer renderer, GraphicsShader shader) throws BackendException {
165-
166-
ShaderBinary vertex = getShaderSource(renderer.getBackend().getVersion(), shader.getFunction(),
176+
if (shader.getType() != ProgramType.VERTEX_FRAGMENT) {
177+
throw new IllegalArgumentException("Not implemented for " + shader.getType());
178+
}
179+
// TODO - use generics for getShaderSource()
180+
vertex = (VulkanShaderBinary) getShaderSource(renderer.getBackend().getVersion(), shader.getFunction(),
167181
ShaderType.VERTEX);
182+
fragment = (VulkanShaderBinary) getShaderSource(renderer.getBackend().getVersion(), shader.getFunction(),
183+
ShaderType.FRAGMENT);
168184
try {
169185
vertex.loadShader(renderer.getBackend(), shader.getFunction());
186+
fragment.loadShader(renderer.getBackend(), shader.getFunction());
187+
vertexModule = vulkan.createShaderModule(vertex);
188+
fragmentModule = vulkan.createShaderModule(fragment);
170189
} catch (IOException e) {
171190
throw new BackendException(e);
172191
}

graphics-by-opengl-j2se/src/main/java/com/nucleus/vulkan/structs/ShaderModule.java

+8
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,12 @@
66
*/
77
public class ShaderModule {
88

9+
private ShaderModuleCreateInfo info;
10+
private long shaderModule;
11+
12+
public ShaderModule(ShaderModuleCreateInfo info, long shaderModule) {
13+
this.info = info;
14+
this.shaderModule = shaderModule;
15+
}
16+
917
}
Original file line numberDiff line numberDiff line change
@@ -1,72 +1,17 @@
11
package com.nucleus.vulkan.structs;
22

3-
import java.io.IOException;
4-
import java.net.URISyntaxException;
5-
import java.nio.ByteBuffer;
6-
7-
import com.nucleus.Backend;
8-
import com.nucleus.io.StreamUtils;
9-
import com.nucleus.shader.Shader.Categorizer;
10-
import com.nucleus.shader.Shader.ShaderType;
11-
import com.nucleus.shader.ShaderBinary;
3+
import com.nucleus.vulkan.shader.VulkanShaderBinary;
124

135
/**
146
* Wrapper for VkShaderModuleCreateInfo
157
*
168
*/
17-
public class ShaderModuleCreateInfo extends ShaderBinary {
18-
19-
public enum Type {
20-
VERTEX("vert", "_vert.spv"),
21-
TESSELATION_CONTROL("tesc", "_tesc.spv"),
22-
TESSELATION("tese", "_tese.spv"),
23-
GEOMETRY("geom", "_geom.spv"),
24-
FRAGMENT("frag", "_frag.spv"),
25-
COMPUTE("comp", "_comp.spv");
26-
27-
public final String stage;
28-
public final String fileName;
29-
30-
Type(String stage, String fileName) {
31-
this.stage = stage;
32-
this.fileName = fileName;
33-
}
34-
}
35-
36-
/**
37-
* Not used
38-
*/
39-
private int flags = 0;
9+
public class ShaderModuleCreateInfo {
4010

41-
private int size;
42-
43-
private int position;
44-
45-
private ByteBuffer data;
46-
47-
public ShaderModuleCreateInfo(String path, String sourcename, String suffix, ShaderType type) {
48-
super(path, sourcename, suffix, type);
49-
}
50-
51-
/**
52-
* Returns the bytebuffer containing shader binary data, with the position of
53-
* the buffer set to point to the first data.
54-
*
55-
* @return The buffer containing data with the proper position, reading data at
56-
* current position will get the correct data.
57-
*/
58-
public ByteBuffer getBuffer() {
59-
data.position(position);
60-
return data;
61-
}
11+
private VulkanShaderBinary binary;
6212

63-
@Override
64-
public void loadShader(Backend backend, Categorizer function) throws IOException {
65-
try {
66-
data = StreamUtils.readBufferFromName(getFullSourceName());
67-
} catch (URISyntaxException e) {
68-
throw new IOException(e);
69-
}
13+
public ShaderModuleCreateInfo(VulkanShaderBinary code) {
14+
binary = code;
7015
}
7116

7217
}

graphics-by-opengl-lwjgl3/src/main/java/com/nucleus/vulkan/lwjgl3/LWJGL3Vulkan11Wrapper.java

+18
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import org.lwjgl.vulkan.VkPhysicalDeviceMemoryProperties;
2727
import org.lwjgl.vulkan.VkPhysicalDeviceProperties;
2828
import org.lwjgl.vulkan.VkQueue;
29+
import org.lwjgl.vulkan.VkShaderModuleCreateInfo;
2930
import org.lwjgl.vulkan.VkSurfaceCapabilitiesKHR;
3031
import org.lwjgl.vulkan.VkSurfaceFormatKHR;
3132
import org.lwjgl.vulkan.VkSwapchainCreateInfoKHR;
@@ -50,6 +51,7 @@
5051
import com.nucleus.vulkan.Vulkan10.PresentModeKHR;
5152
import com.nucleus.vulkan.Vulkan10.SurfaceFormat;
5253
import com.nucleus.vulkan.Vulkan11Wrapper;
54+
import com.nucleus.vulkan.shader.VulkanShaderBinary;
5355
import com.nucleus.vulkan.structs.DeviceLimits;
5456
import com.nucleus.vulkan.structs.ExtensionProperties;
5557
import com.nucleus.vulkan.structs.Extent2D;
@@ -60,6 +62,8 @@
6062
import com.nucleus.vulkan.structs.PhysicalDeviceMemoryProperties;
6163
import com.nucleus.vulkan.structs.PhysicalDeviceProperties;
6264
import com.nucleus.vulkan.structs.QueueFamilyProperties;
65+
import com.nucleus.vulkan.structs.ShaderModule;
66+
import com.nucleus.vulkan.structs.ShaderModuleCreateInfo;
6367
import com.nucleus.vulkan.structs.SwapChain;
6468

6569
public class LWJGL3Vulkan11Wrapper extends Vulkan11Wrapper {
@@ -549,4 +553,18 @@ protected ImageView createImageView(ImageViewCreateInfo createInfo) {
549553
return new ImageView(createInfo.image, view);
550554
}
551555

556+
@Override
557+
protected ShaderModule createShaderModule(VulkanShaderBinary binary) {
558+
binary.getBuffer().rewind();
559+
VkShaderModuleCreateInfo info = VkShaderModuleCreateInfo.calloc()
560+
.sType(VK10.VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO)
561+
.pNext(0)
562+
.pCode(binary.getBuffer())
563+
.flags(0);
564+
long codesize = info.codeSize();
565+
SimpleLogger.d(getClass(), "Codesize=" + codesize);
566+
assertResult(VK10.vkCreateShaderModule(deviceInstance, info, null, lb));
567+
return new ShaderModule(new ShaderModuleCreateInfo(binary), lb.get(0));
568+
}
569+
552570
}

0 commit comments

Comments
 (0)