forked from MoonsideGames/Refresh
Pipeline creation copied over from old work + shaderc update
parent
e48941eb48
commit
e7b2542bc0
|
@ -200,20 +200,20 @@ partial class Program
|
||||||
WriteShaderBlob(writer, inputPath, 1);
|
WriteShaderBlob(writer, inputPath, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (data.d3d11)
|
||||||
|
{
|
||||||
|
string inputPath = Path.Combine(tempDir, $"{shaderName}.hlsl");
|
||||||
|
WriteShaderBlob(writer, inputPath, 2);
|
||||||
|
}
|
||||||
|
|
||||||
#if PS5
|
#if PS5
|
||||||
if (data.ps5)
|
if (data.ps5)
|
||||||
{
|
{
|
||||||
string ext = GetPS5ShaderFileExtension();
|
string ext = GetPS5ShaderFileExtension();
|
||||||
string inputPath = Path.Combine(tempDir, $"{shaderName}{ext}");
|
string inputPath = Path.Combine(tempDir, $"{shaderName}{ext}");
|
||||||
WriteShaderBlob(writer, inputPath, 2);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (data.d3d11)
|
|
||||||
{
|
|
||||||
string inputPath = Path.Combine(tempDir, $"{shaderName}.hlsl");
|
|
||||||
WriteShaderBlob(writer, inputPath, 3);
|
WriteShaderBlob(writer, inputPath, 3);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -228,17 +228,6 @@ static D3D11_STENCIL_OP RefreshToD3D11_StencilOp[] =
|
||||||
D3D11_STENCIL_OP_DECR /* DECREMENT_AND_WRAP */
|
D3D11_STENCIL_OP_DECR /* DECREMENT_AND_WRAP */
|
||||||
};
|
};
|
||||||
|
|
||||||
static int32_t RefreshToD3D11_SampleCount[] =
|
|
||||||
{
|
|
||||||
1, /* 1 */
|
|
||||||
2, /* 2 */
|
|
||||||
4, /* 4 */
|
|
||||||
8, /* 8 */
|
|
||||||
16, /* 16 */
|
|
||||||
32, /* 32 */
|
|
||||||
64 /* 64 */
|
|
||||||
};
|
|
||||||
|
|
||||||
static D3D11_INPUT_CLASSIFICATION RefreshToD3D11_VertexInputRate[] =
|
static D3D11_INPUT_CLASSIFICATION RefreshToD3D11_VertexInputRate[] =
|
||||||
{
|
{
|
||||||
D3D11_INPUT_PER_VERTEX_DATA, /* VERTEX */
|
D3D11_INPUT_PER_VERTEX_DATA, /* VERTEX */
|
||||||
|
@ -317,6 +306,36 @@ typedef struct D3D11CommandBufferPool
|
||||||
uint32_t capacity;
|
uint32_t capacity;
|
||||||
} D3D11CommandBufferPool;
|
} D3D11CommandBufferPool;
|
||||||
|
|
||||||
|
typedef struct D3D11ShaderModule
|
||||||
|
{
|
||||||
|
ID3D11DeviceChild *shader; /* ID3D11VertexShader, ID3D11PixelShader, ID3D11ComputeShader */
|
||||||
|
ID3D10Blob *blob;
|
||||||
|
char *shaderSource;
|
||||||
|
size_t shaderSourceLength;
|
||||||
|
} D3D11ShaderModule;
|
||||||
|
|
||||||
|
typedef struct D3D11GraphicsPipeline
|
||||||
|
{
|
||||||
|
float blendConstants[4];
|
||||||
|
|
||||||
|
int32_t numColorAttachments;
|
||||||
|
DXGI_FORMAT colorAttachmentFormats[MAX_COLOR_TARGET_BINDINGS];
|
||||||
|
ID3D11BlendState *colorAttachmentBlendState;
|
||||||
|
|
||||||
|
uint8_t hasDepthStencilAttachment;
|
||||||
|
DXGI_FORMAT depthStencilAttachmentFormat;
|
||||||
|
|
||||||
|
D3D11_PRIMITIVE_TOPOLOGY primitiveTopology;
|
||||||
|
uint32_t stencilRef;
|
||||||
|
ID3D11DepthStencilState *depthStencilState;
|
||||||
|
ID3D11RasterizerState *rasterizerState;
|
||||||
|
ID3D11InputLayout *inputLayout;
|
||||||
|
|
||||||
|
Refresh_MultisampleState multisampleState;
|
||||||
|
ID3D11VertexShader *vertexShader;
|
||||||
|
ID3D11PixelShader *fragmentShader;
|
||||||
|
} D3D11GraphicsPipeline;
|
||||||
|
|
||||||
typedef struct D3D11Renderer
|
typedef struct D3D11Renderer
|
||||||
{
|
{
|
||||||
ID3D11Device *device;
|
ID3D11Device *device;
|
||||||
|
@ -475,6 +494,224 @@ static void D3D11_DispatchCompute(
|
||||||
|
|
||||||
/* State Creation */
|
/* State Creation */
|
||||||
|
|
||||||
|
static ID3D11BlendState* D3D11_INTERNAL_FetchBlendState(
|
||||||
|
D3D11Renderer *renderer,
|
||||||
|
uint32_t numColorAttachments,
|
||||||
|
Refresh_ColorAttachmentDescription *colorAttachments
|
||||||
|
) {
|
||||||
|
ID3D11BlendState *result;
|
||||||
|
D3D11_BLEND_DESC blendDesc;
|
||||||
|
uint32_t i;
|
||||||
|
HRESULT res;
|
||||||
|
|
||||||
|
/* Create a new blend state.
|
||||||
|
* The spec says the driver will not create duplicate states, so there's no need to cache.
|
||||||
|
*/
|
||||||
|
SDL_zero(blendDesc); /* needed for any unused RT entries */
|
||||||
|
|
||||||
|
blendDesc.AlphaToCoverageEnable = FALSE;
|
||||||
|
blendDesc.IndependentBlendEnable = TRUE;
|
||||||
|
|
||||||
|
for (i = 0; i < numColorAttachments; i += 1)
|
||||||
|
{
|
||||||
|
blendDesc.RenderTarget[i].BlendEnable = colorAttachments[i].blendState.blendEnable;
|
||||||
|
blendDesc.RenderTarget[i].BlendOp = RefreshToD3D11_BlendOp[
|
||||||
|
colorAttachments[i].blendState.colorBlendOp
|
||||||
|
];
|
||||||
|
blendDesc.RenderTarget[i].BlendOpAlpha = RefreshToD3D11_BlendOp[
|
||||||
|
colorAttachments[i].blendState.alphaBlendOp
|
||||||
|
];
|
||||||
|
blendDesc.RenderTarget[i].DestBlend = RefreshToD3D11_BlendFactor[
|
||||||
|
colorAttachments[i].blendState.dstColorBlendFactor
|
||||||
|
];
|
||||||
|
blendDesc.RenderTarget[i].DestBlendAlpha = RefreshToD3D11_BlendFactor[
|
||||||
|
colorAttachments[i].blendState.dstAlphaBlendFactor
|
||||||
|
];
|
||||||
|
blendDesc.RenderTarget[i].RenderTargetWriteMask = colorAttachments[i].blendState.colorWriteMask;
|
||||||
|
blendDesc.RenderTarget[i].SrcBlend = RefreshToD3D11_BlendFactor[
|
||||||
|
colorAttachments[i].blendState.srcColorBlendFactor
|
||||||
|
];
|
||||||
|
blendDesc.RenderTarget[i].SrcBlendAlpha = RefreshToD3D11_BlendFactor[
|
||||||
|
colorAttachments[i].blendState.srcAlphaBlendFactor
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
res = ID3D11Device_CreateBlendState(
|
||||||
|
renderer->device,
|
||||||
|
&blendDesc,
|
||||||
|
&result
|
||||||
|
);
|
||||||
|
ERROR_CHECK_RETURN("Could not create blend state", NULL);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ID3D11DepthStencilState* D3D11_INTERNAL_FetchDepthStencilState(
|
||||||
|
D3D11Renderer *renderer,
|
||||||
|
Refresh_DepthStencilState depthStencilState
|
||||||
|
) {
|
||||||
|
ID3D11DepthStencilState *result;
|
||||||
|
D3D11_DEPTH_STENCIL_DESC dsDesc;
|
||||||
|
HRESULT res;
|
||||||
|
|
||||||
|
/* Create a new depth-stencil state.
|
||||||
|
* The spec says the driver will not create duplicate states, so there's no need to cache.
|
||||||
|
*/
|
||||||
|
dsDesc.DepthEnable = depthStencilState.depthTestEnable;
|
||||||
|
dsDesc.StencilEnable = depthStencilState.stencilTestEnable;
|
||||||
|
dsDesc.DepthFunc = depthStencilState.compareOp;
|
||||||
|
dsDesc.DepthWriteMask = (
|
||||||
|
depthStencilState.depthWriteEnable ?
|
||||||
|
D3D11_DEPTH_WRITE_MASK_ALL :
|
||||||
|
D3D11_DEPTH_WRITE_MASK_ZERO
|
||||||
|
);
|
||||||
|
|
||||||
|
dsDesc.BackFace.StencilFunc = depthStencilState.backStencilState.compareOp;
|
||||||
|
dsDesc.BackFace.StencilDepthFailOp = depthStencilState.backStencilState.depthFailOp;
|
||||||
|
dsDesc.BackFace.StencilFailOp = depthStencilState.backStencilState.failOp;
|
||||||
|
dsDesc.BackFace.StencilPassOp = depthStencilState.backStencilState.passOp;
|
||||||
|
|
||||||
|
dsDesc.FrontFace.StencilFunc = depthStencilState.frontStencilState.compareOp;
|
||||||
|
dsDesc.FrontFace.StencilDepthFailOp = depthStencilState.frontStencilState.depthFailOp;
|
||||||
|
dsDesc.FrontFace.StencilFailOp = depthStencilState.frontStencilState.failOp;
|
||||||
|
dsDesc.FrontFace.StencilPassOp = depthStencilState.frontStencilState.passOp;
|
||||||
|
|
||||||
|
/* FIXME: D3D11 doesn't have separate read/write masks for each stencil side. What should we do? */
|
||||||
|
dsDesc.StencilReadMask = depthStencilState.backStencilState.compareMask;
|
||||||
|
dsDesc.StencilWriteMask = depthStencilState.backStencilState.writeMask;
|
||||||
|
|
||||||
|
/* FIXME: What do we do with these?
|
||||||
|
* depthStencilState.depthBoundsTestEnable
|
||||||
|
* depthStencilState.maxDepthBounds
|
||||||
|
* depthStencilState.minDepthBounds
|
||||||
|
*/
|
||||||
|
|
||||||
|
res = ID3D11Device_CreateDepthStencilState(
|
||||||
|
renderer->device,
|
||||||
|
&dsDesc,
|
||||||
|
&result
|
||||||
|
);
|
||||||
|
ERROR_CHECK_RETURN("Could not create depth-stencil state", NULL);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ID3D11RasterizerState* D3D11_INTERNAL_FetchRasterizerState(
|
||||||
|
D3D11Renderer *renderer,
|
||||||
|
Refresh_RasterizerState rasterizerState
|
||||||
|
) {
|
||||||
|
ID3D11RasterizerState *result;
|
||||||
|
D3D11_RASTERIZER_DESC rasterizerDesc;
|
||||||
|
HRESULT res;
|
||||||
|
|
||||||
|
/* Create a new rasterizer state.
|
||||||
|
* The spec says the driver will not create duplicate states, so there's no need to cache.
|
||||||
|
*/
|
||||||
|
rasterizerDesc.AntialiasedLineEnable = FALSE;
|
||||||
|
rasterizerDesc.CullMode = RefreshToD3D11_CullMode[rasterizerState.cullMode];
|
||||||
|
rasterizerDesc.DepthBias = (INT) rasterizerState.depthBiasConstantFactor; /* FIXME: Is this cast correct? */
|
||||||
|
rasterizerDesc.DepthBiasClamp = rasterizerState.depthBiasClamp;
|
||||||
|
rasterizerDesc.DepthClipEnable = TRUE; /* FIXME: Do we want this...? */
|
||||||
|
rasterizerDesc.FillMode = (rasterizerState.fillMode == REFRESH_FILLMODE_FILL) ? D3D11_FILL_SOLID : D3D11_FILL_WIREFRAME;
|
||||||
|
rasterizerDesc.FrontCounterClockwise = (rasterizerState.frontFace == REFRESH_FRONTFACE_COUNTER_CLOCKWISE);
|
||||||
|
rasterizerDesc.MultisampleEnable = TRUE; /* only applies to MSAA render targets */
|
||||||
|
rasterizerDesc.ScissorEnable = TRUE;
|
||||||
|
rasterizerDesc.SlopeScaledDepthBias = rasterizerState.depthBiasSlopeFactor;
|
||||||
|
|
||||||
|
res = ID3D11Device_CreateRasterizerState(
|
||||||
|
renderer->device,
|
||||||
|
&rasterizerDesc,
|
||||||
|
&result
|
||||||
|
);
|
||||||
|
ERROR_CHECK_RETURN("Could not create rasterizer state", NULL);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint32_t D3D11_INTERNAL_FindIndexOfVertexBinding(
|
||||||
|
uint32_t targetBinding,
|
||||||
|
const Refresh_VertexBinding *bindings,
|
||||||
|
uint32_t numBindings
|
||||||
|
) {
|
||||||
|
uint32_t i;
|
||||||
|
for (i = 0; i < numBindings; i += 1)
|
||||||
|
{
|
||||||
|
if (bindings[i].binding == targetBinding)
|
||||||
|
{
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Refresh_LogError("Could not find vertex binding %d!", targetBinding);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ID3D11InputLayout* D3D11_INTERNAL_FetchInputLayout(
|
||||||
|
D3D11Renderer *renderer,
|
||||||
|
Refresh_VertexInputState inputState,
|
||||||
|
void *shaderBytes,
|
||||||
|
size_t shaderByteLength
|
||||||
|
) {
|
||||||
|
ID3D11InputLayout *result = NULL;
|
||||||
|
D3D11_INPUT_ELEMENT_DESC *elementDescs;
|
||||||
|
uint32_t i, bindingIndex;
|
||||||
|
HRESULT res;
|
||||||
|
|
||||||
|
/* Allocate an array of vertex elements */
|
||||||
|
elementDescs = SDL_stack_alloc(
|
||||||
|
D3D11_INPUT_ELEMENT_DESC,
|
||||||
|
inputState.vertexAttributeCount
|
||||||
|
);
|
||||||
|
|
||||||
|
/* Create the array of input elements */
|
||||||
|
for (i = 0; i < inputState.vertexAttributeCount; i += 1)
|
||||||
|
{
|
||||||
|
elementDescs[i].AlignedByteOffset = inputState.vertexAttributes[i].offset;
|
||||||
|
elementDescs[i].Format = RefreshToD3D11_VertexFormat[
|
||||||
|
inputState.vertexAttributes[i].format
|
||||||
|
];
|
||||||
|
elementDescs[i].InputSlot = inputState.vertexAttributes[i].binding;
|
||||||
|
|
||||||
|
bindingIndex = D3D11_INTERNAL_FindIndexOfVertexBinding(
|
||||||
|
elementDescs[i].InputSlot,
|
||||||
|
inputState.vertexBindings,
|
||||||
|
inputState.vertexBindingCount
|
||||||
|
);
|
||||||
|
elementDescs[i].InputSlotClass = RefreshToD3D11_VertexInputRate[
|
||||||
|
inputState.vertexBindings[bindingIndex].inputRate
|
||||||
|
];
|
||||||
|
/* The spec requires this to be 0 for per-vertex data */
|
||||||
|
elementDescs[i].InstanceDataStepRate = (
|
||||||
|
elementDescs[i].InputSlotClass == D3D11_INPUT_PER_INSTANCE_DATA ? 1 : 0
|
||||||
|
);
|
||||||
|
|
||||||
|
elementDescs[i].SemanticIndex = inputState.vertexAttributes[i].location;
|
||||||
|
elementDescs[i].SemanticName = "TEXCOORD";
|
||||||
|
}
|
||||||
|
|
||||||
|
res = ID3D11Device_CreateInputLayout(
|
||||||
|
renderer->device,
|
||||||
|
elementDescs,
|
||||||
|
inputState.vertexAttributeCount,
|
||||||
|
shaderBytes,
|
||||||
|
shaderByteLength,
|
||||||
|
&result
|
||||||
|
);
|
||||||
|
if (FAILED(res))
|
||||||
|
{
|
||||||
|
Refresh_LogError("Could not create input layout! Error: %X", res);
|
||||||
|
SDL_stack_free(elementDescs);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* FIXME:
|
||||||
|
* These are not cached by the driver! Should we cache them, or allow duplicates?
|
||||||
|
* If we have one input layout per graphics pipeline maybe that wouldn't be so bad...?
|
||||||
|
*/
|
||||||
|
|
||||||
|
SDL_stack_free(elementDescs);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
static Refresh_ComputePipeline* D3D11_CreateComputePipeline(
|
static Refresh_ComputePipeline* D3D11_CreateComputePipeline(
|
||||||
Refresh_Renderer *driverData,
|
Refresh_Renderer *driverData,
|
||||||
|
@ -488,8 +725,141 @@ static Refresh_GraphicsPipeline* D3D11_CreateGraphicsPipeline(
|
||||||
Refresh_Renderer *driverData,
|
Refresh_Renderer *driverData,
|
||||||
Refresh_GraphicsPipelineCreateInfo *pipelineCreateInfo
|
Refresh_GraphicsPipelineCreateInfo *pipelineCreateInfo
|
||||||
) {
|
) {
|
||||||
NOT_IMPLEMENTED
|
D3D11Renderer *renderer = (D3D11Renderer*) driverData;
|
||||||
return NULL;
|
D3D11GraphicsPipeline *pipeline = (D3D11GraphicsPipeline*) SDL_malloc(sizeof(D3D11GraphicsPipeline));
|
||||||
|
D3D11ShaderModule *vertShaderModule = (D3D11ShaderModule*) pipelineCreateInfo->vertexShaderInfo.shaderModule;
|
||||||
|
D3D11ShaderModule *fragShaderModule = (D3D11ShaderModule*) pipelineCreateInfo->fragmentShaderInfo.shaderModule;
|
||||||
|
ID3D10Blob *errorBlob;
|
||||||
|
int32_t i;
|
||||||
|
HRESULT res;
|
||||||
|
|
||||||
|
/* Color */
|
||||||
|
|
||||||
|
pipeline->numColorAttachments = pipelineCreateInfo->attachmentInfo.colorAttachmentCount;
|
||||||
|
for (i = 0; i < pipeline->numColorAttachments; i += 1)
|
||||||
|
{
|
||||||
|
pipeline->colorAttachmentFormats[i] = RefreshToD3D11_TextureFormat[
|
||||||
|
pipelineCreateInfo->attachmentInfo.colorAttachmentDescriptions[i].format
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
pipeline->blendConstants[0] = pipelineCreateInfo->blendConstants[0];
|
||||||
|
pipeline->blendConstants[1] = pipelineCreateInfo->blendConstants[1];
|
||||||
|
pipeline->blendConstants[2] = pipelineCreateInfo->blendConstants[2];
|
||||||
|
pipeline->blendConstants[3] = pipelineCreateInfo->blendConstants[3];
|
||||||
|
|
||||||
|
pipeline->multisampleState = pipelineCreateInfo->multisampleState;
|
||||||
|
|
||||||
|
pipeline->colorAttachmentBlendState = D3D11_INTERNAL_FetchBlendState(
|
||||||
|
renderer,
|
||||||
|
pipelineCreateInfo->attachmentInfo.colorAttachmentCount,
|
||||||
|
pipelineCreateInfo->attachmentInfo.colorAttachmentDescriptions
|
||||||
|
);
|
||||||
|
|
||||||
|
/* Depth stencil */
|
||||||
|
|
||||||
|
pipeline->hasDepthStencilAttachment = pipelineCreateInfo->attachmentInfo.hasDepthStencilAttachment;
|
||||||
|
|
||||||
|
pipeline->depthStencilAttachmentFormat = RefreshToD3D11_TextureFormat[
|
||||||
|
pipelineCreateInfo->attachmentInfo.depthStencilFormat
|
||||||
|
];
|
||||||
|
|
||||||
|
pipeline->stencilRef = pipelineCreateInfo->depthStencilState.backStencilState.reference; /* FIXME: Should we use front or back? */
|
||||||
|
|
||||||
|
pipeline->depthStencilState = D3D11_INTERNAL_FetchDepthStencilState(
|
||||||
|
renderer,
|
||||||
|
pipelineCreateInfo->depthStencilState
|
||||||
|
);
|
||||||
|
|
||||||
|
/* Rasterizer */
|
||||||
|
|
||||||
|
pipeline->primitiveTopology = RefreshToD3D11_PrimitiveType[pipelineCreateInfo->primitiveType];
|
||||||
|
|
||||||
|
pipeline->rasterizerState = D3D11_INTERNAL_FetchRasterizerState(
|
||||||
|
renderer,
|
||||||
|
pipelineCreateInfo->rasterizerState
|
||||||
|
);
|
||||||
|
|
||||||
|
/* Vertex shader */
|
||||||
|
|
||||||
|
if (vertShaderModule->shader == NULL)
|
||||||
|
{
|
||||||
|
res = renderer->D3DCompileFunc(
|
||||||
|
vertShaderModule->shaderSource,
|
||||||
|
vertShaderModule->shaderSourceLength,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
"main",
|
||||||
|
"vs_5_0",
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
&vertShaderModule->blob,
|
||||||
|
&errorBlob
|
||||||
|
);
|
||||||
|
if (FAILED(res))
|
||||||
|
{
|
||||||
|
Refresh_LogError("Vertex Shader Compile Error: %s", ID3D10Blob_GetBufferPointer(errorBlob));
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
res = ID3D11Device_CreateVertexShader(
|
||||||
|
renderer->device,
|
||||||
|
ID3D10Blob_GetBufferPointer(vertShaderModule->blob),
|
||||||
|
ID3D10Blob_GetBufferSize(vertShaderModule->blob),
|
||||||
|
NULL,
|
||||||
|
(ID3D11VertexShader**) &vertShaderModule->shader
|
||||||
|
);
|
||||||
|
ERROR_CHECK_RETURN("Could not create vertex shader", NULL);
|
||||||
|
}
|
||||||
|
pipeline->vertexShader = (ID3D11VertexShader*) vertShaderModule->shader;
|
||||||
|
|
||||||
|
/* Input Layout */
|
||||||
|
|
||||||
|
pipeline->inputLayout = D3D11_INTERNAL_FetchInputLayout(
|
||||||
|
renderer,
|
||||||
|
pipelineCreateInfo->vertexInputState,
|
||||||
|
ID3D10Blob_GetBufferPointer(vertShaderModule->blob),
|
||||||
|
ID3D10Blob_GetBufferSize(vertShaderModule->blob)
|
||||||
|
);
|
||||||
|
|
||||||
|
/* Fragment Shader */
|
||||||
|
|
||||||
|
if (fragShaderModule->shader == NULL)
|
||||||
|
{
|
||||||
|
res = renderer->D3DCompileFunc(
|
||||||
|
fragShaderModule->shaderSource,
|
||||||
|
fragShaderModule->shaderSourceLength,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
"main",
|
||||||
|
"ps_5_0",
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
&fragShaderModule->blob,
|
||||||
|
&errorBlob
|
||||||
|
);
|
||||||
|
if (FAILED(res))
|
||||||
|
{
|
||||||
|
Refresh_LogError("Fragment Shader Compile Error: %s", ID3D10Blob_GetBufferPointer(errorBlob));
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
res = ID3D11Device_CreatePixelShader(
|
||||||
|
renderer->device,
|
||||||
|
ID3D10Blob_GetBufferPointer(fragShaderModule->blob),
|
||||||
|
ID3D10Blob_GetBufferSize(fragShaderModule->blob),
|
||||||
|
NULL,
|
||||||
|
(ID3D11PixelShader**) &fragShaderModule->shader
|
||||||
|
);
|
||||||
|
ERROR_CHECK_RETURN("Could not create pixel shader", NULL);
|
||||||
|
}
|
||||||
|
pipeline->fragmentShader = (ID3D11PixelShader*) fragShaderModule->shader;
|
||||||
|
|
||||||
|
/* FIXME: Need to create uniform buffers for the shaders */
|
||||||
|
|
||||||
|
return (Refresh_GraphicsPipeline*) pipeline;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Refresh_Sampler* D3D11_CreateSampler(
|
static Refresh_Sampler* D3D11_CreateSampler(
|
||||||
|
|
Loading…
Reference in New Issue