| 114 | } |
| 115 | |
| 116 | static Shader_Program create_shader_program( |
| 117 | Graphics *ctx, char *shader_string, size_t shader_string_size, |
| 118 | char * vs_entry_point, char * ps_entry_point, size_t constants_size, |
| 119 | int input_elements, D3D11_INPUT_ELEMENT_DESC *input_desc) { |
| 120 | |
| 121 | Shader_Program shader = { 0 }; |
| 122 | |
| 123 | ID3DBlob *vs_blob = compile_shader_memory(shader_string, shader_string_size, vs_entry_point, "vs_5_0"); |
| 124 | ctx->device->CreateVertexShader(vs_blob->GetBufferPointer(), vs_blob->GetBufferSize(), nullptr, &shader.vertex_shader); |
| 125 | |
| 126 | ID3DBlob *ps_blob = compile_shader_memory(shader_string, shader_string_size, ps_entry_point, "ps_5_0"); |
| 127 | ctx->device->CreatePixelShader(ps_blob->GetBufferPointer(), ps_blob->GetBufferSize(), nullptr, &shader.pixel_shader); |
| 128 | |
| 129 | if (input_desc) { |
| 130 | ctx->device->CreateInputLayout( |
| 131 | input_desc, input_elements, |
| 132 | vs_blob->GetBufferPointer(), vs_blob->GetBufferSize(), |
| 133 | &shader.input_layout); |
| 134 | } |
| 135 | |
| 136 | if (constants_size) { |
| 137 | shader.constants_buffer = create_constants_buffer(ctx, constants_size); |
| 138 | } |
| 139 | |
| 140 | shader.constants_buffer_size = constants_size; |
| 141 | |
| 142 | return shader; |
| 143 | } |
| 144 | |
| 145 | static void upload_constants(Shader_Program* program, void* data) { |
| 146 | D3D11_MAPPED_SUBRESOURCE mapped; |
no test coverage detected