|
17 | 17 | import com.nucleus.shader.BlockBuffer;
|
18 | 18 | import com.nucleus.shader.GraphicsShader;
|
19 | 19 | import com.nucleus.shader.Shader.Categorizer;
|
| 20 | +import com.nucleus.shader.Shader.ProgramType; |
20 | 21 | import com.nucleus.shader.Shader.ShaderType;
|
21 | 22 | import com.nucleus.shader.ShaderBinary;
|
22 | 23 | import com.nucleus.shader.ShaderVariable;
|
23 | 24 | import com.nucleus.shader.ShaderVariable.VariableType;
|
24 | 25 | 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; |
27 | 29 |
|
28 | 30 | public class VulkanGraphicsPipeline implements GraphicsPipeline<ShaderBinary> {
|
29 | 31 |
|
30 | 32 | private Vulkan10Wrapper vulkan;
|
| 33 | + private VulkanShaderBinary vertex; |
| 34 | + private VulkanShaderBinary fragment; |
| 35 | + private ShaderModule vertexModule; |
| 36 | + private ShaderModule fragmentModule; |
31 | 37 |
|
32 | 38 | public VulkanGraphicsPipeline(Vulkan10Wrapper vulkan) {
|
33 | 39 | if (vulkan == null) {
|
@@ -113,27 +119,32 @@ public void uploadAttributes(FloatBuffer attributeData, ShaderVariable[] activeA
|
113 | 119 | @Override
|
114 | 120 | public ShaderBinary getShaderSource(Renderers version, Categorizer function, ShaderType type) {
|
115 | 121 | String sourceNameVersion = ShaderBinary.getSourceNameVersion(version);
|
| 122 | + VulkanShaderBinary spirv = null; |
116 | 123 | switch (type) {
|
117 | 124 | case VERTEX:
|
118 |
| - return new ShaderModuleCreateInfo(ShaderBinary.PROGRAM_DIRECTORY + sourceNameVersion, |
| 125 | + spirv = new VulkanShaderBinary(ShaderBinary.PROGRAM_DIRECTORY + sourceNameVersion, |
119 | 126 | function.getShaderSourceName(type), Type.VERTEX.fileName,
|
120 | 127 | type);
|
| 128 | + break; |
121 | 129 | case FRAGMENT:
|
122 |
| - return new ShaderModuleCreateInfo(ShaderBinary.PROGRAM_DIRECTORY + sourceNameVersion, |
| 130 | + spirv = new VulkanShaderBinary(ShaderBinary.PROGRAM_DIRECTORY + sourceNameVersion, |
123 | 131 | function.getShaderSourceName(type), Type.FRAGMENT.fileName,
|
124 | 132 | type);
|
| 133 | + break; |
125 | 134 | case COMPUTE:
|
126 |
| - return new ShaderModuleCreateInfo(ShaderBinary.PROGRAM_DIRECTORY + sourceNameVersion, |
| 135 | + spirv = new VulkanShaderBinary(ShaderBinary.PROGRAM_DIRECTORY + sourceNameVersion, |
127 | 136 | function.getShaderSourceName(type), Type.COMPUTE.fileName,
|
128 | 137 | type);
|
| 138 | + break; |
129 | 139 | case GEOMETRY:
|
130 |
| - return new ShaderModuleCreateInfo(ShaderBinary.PROGRAM_DIRECTORY + sourceNameVersion, |
| 140 | + spirv = new VulkanShaderBinary(ShaderBinary.PROGRAM_DIRECTORY + sourceNameVersion, |
131 | 141 | function.getShaderSourceName(type), Type.GEOMETRY.fileName,
|
132 | 142 | type);
|
133 |
| - |
| 143 | + break; |
134 | 144 | default:
|
135 | 145 | throw new IllegalArgumentException("Not implemented for type: " + type);
|
136 | 146 | }
|
| 147 | + return spirv; |
137 | 148 | }
|
138 | 149 |
|
139 | 150 | @Override
|
@@ -162,11 +173,19 @@ public VariableIndexer getLocationMapping() {
|
162 | 173 |
|
163 | 174 | @Override
|
164 | 175 | 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(), |
167 | 181 | ShaderType.VERTEX);
|
| 182 | + fragment = (VulkanShaderBinary) getShaderSource(renderer.getBackend().getVersion(), shader.getFunction(), |
| 183 | + ShaderType.FRAGMENT); |
168 | 184 | try {
|
169 | 185 | vertex.loadShader(renderer.getBackend(), shader.getFunction());
|
| 186 | + fragment.loadShader(renderer.getBackend(), shader.getFunction()); |
| 187 | + vertexModule = vulkan.createShaderModule(vertex); |
| 188 | + fragmentModule = vulkan.createShaderModule(fragment); |
170 | 189 | } catch (IOException e) {
|
171 | 190 | throw new BackendException(e);
|
172 | 191 | }
|
|
0 commit comments