if(!value.empty())
{
// must be fixed
- for (auto &binding : value[0]->bindTextures.textureBindings)
+ for(auto& binding : value[0]->data.bindTextures.textureBindings)
{
- if (binding.texture)
+ if(binding.texture)
{
auto texture = Uncast<TestGraphicsTexture>(binding.texture);
texture->Bind(binding.binding);
- if (binding.sampler)
+ if(binding.sampler)
{
auto sampler = Uncast<TestGraphicsSampler>(binding.sampler);
- if (sampler)
+ if(sampler)
{
sampler->Apply(texture->GetTarget());
}
// IndexBuffer binding,
auto bindIndexBufferCmds = commandBuffer->GetCommandsByType(0 | CommandType::BIND_INDEX_BUFFER);
- if (!bindIndexBufferCmds.empty())
+ if(!bindIndexBufferCmds.empty())
{
- auto &indexBufferBinding = bindIndexBufferCmds[0]->bindIndexBuffer;
- if (indexBufferBinding.buffer)
+ auto& indexBufferBinding = bindIndexBufferCmds[0]->data.bindIndexBuffer;
+ if(indexBufferBinding.buffer)
{
auto buffer = Uncast<TestGraphicsBuffer>(indexBufferBinding.buffer);
buffer->Bind();
// VertexBuffer binding,
auto bindVertexBufferCmds = commandBuffer->GetCommandsByType(0 | CommandType::BIND_VERTEX_BUFFERS);
- if (!bindVertexBufferCmds.empty())
+ if(!bindVertexBufferCmds.empty())
{
- for (auto &binding : bindVertexBufferCmds[0]->bindVertexBuffers.vertexBufferBindings)
+ for(auto& binding : bindVertexBufferCmds[0]->data.bindVertexBuffers.vertexBufferBindings)
{
auto graphicsBuffer = binding.buffer;
auto vertexBuffer = Uncast<TestGraphicsBuffer>(graphicsBuffer);
vertexBuffer->Bind();
}
}
+
+ bool scissorEnabled = false;
+
+ auto scissorTestList = commandBuffer->GetCommandsByType(0 | CommandType::SET_SCISSOR_TEST);
+ if(!scissorTestList.empty())
+ {
+ if(scissorTestList[0]->data.scissorTest.enable)
+ {
+ mGl.Enable(GL_SCISSOR_TEST);
+ scissorEnabled = true;
+ }
+ else
+ {
+ mGl.Disable(GL_SCISSOR_TEST);
+ }
+ }
+
+ auto scissorList = commandBuffer->GetCommandsByType(0 | CommandType::SET_SCISSOR);
+ if(!scissorList.empty() && scissorEnabled)
+ {
+ auto& rect = scissorList[0]->data.scissor.region;
+ mGl.Scissor(rect.x, rect.y, rect.width, rect.height);
+ }
+
+ auto viewportList = commandBuffer->GetCommandsByType(0 | CommandType::SET_VIEWPORT);
+ if(!viewportList.empty())
+ {
+ mGl.Viewport(viewportList[0]->data.viewport.region.x, viewportList[0]->data.viewport.region.y, viewportList[0]->data.viewport.region.width, viewportList[0]->data.viewport.region.height);
+ }
+
+ // ignore viewport enable
+
// Pipeline attribute setup
- auto bindPipelineCmds = commandBuffer->GetCommandsByType(0 | CommandType::BIND_PIPELINE);
- if (!bindPipelineCmds.empty())
+ auto bindPipelineCmds = commandBuffer->GetCommandsByType(0 | CommandType::BIND_PIPELINE);
+ if(!bindPipelineCmds.empty())
{
- auto pipeline = bindPipelineCmds[0]->bindPipeline.pipeline;
- auto &vi = pipeline->vertexInputState;
- for (auto &attribute : vi.attributes)
+ auto pipeline = bindPipelineCmds[0]->data.bindPipeline.pipeline;
+ auto& vi = pipeline->vertexInputState;
+ for(auto& attribute : vi.attributes)
{
mGl.EnableVertexAttribArray(attribute.location);
uint32_t attributeOffset = attribute.offset;
GetGlType(attribute.format),
GL_FALSE, // Not normalized
stride,
- reinterpret_cast<void *>(attributeOffset));
+ reinterpret_cast<void*>(attributeOffset));
}
+
// Cull face setup
- auto &rasterizationState = pipeline->rasterizationState;
- if (rasterizationState.cullMode == Graphics::CullMode::NONE)
+ auto& rasterizationState = pipeline->rasterizationState;
+ if(rasterizationState.cullMode == Graphics::CullMode::NONE)
{
mGl.Disable(GL_CULL_FACE);
}
// so it isn't present in the API (and won't have any tests!)
// Blending setup
- auto &colorBlendState = pipeline->colorBlendState;
- if (colorBlendState.blendEnable)
+ auto& colorBlendState = pipeline->colorBlendState;
+ if(colorBlendState.blendEnable)
{
mGl.Enable(GL_BLEND);
GetBlendFactor(colorBlendState.dstColorBlendFactor),
GetBlendFactor(colorBlendState.srcAlphaBlendFactor),
GetBlendFactor(colorBlendState.dstAlphaBlendFactor));
- if (colorBlendState.colorBlendOp != colorBlendState.alphaBlendOp)
+ if(colorBlendState.colorBlendOp != colorBlendState.alphaBlendOp)
{
mGl.BlendEquationSeparate(GetBlendOp(colorBlendState.colorBlendOp), GetBlendOp(colorBlendState.alphaBlendOp));
}
// UniformBuffer binding (once we know pipeline)
auto bindUniformBuffersCmds = commandBuffer->GetCommandsByType(0 | CommandType::BIND_UNIFORM_BUFFER);
- if (!bindUniformBuffersCmds.empty())
+ if(!bindUniformBuffersCmds.empty())
{
- auto buffer = bindUniformBuffersCmds[0]->bindUniformBuffers.standaloneUniformsBufferBinding;
+ auto buffer = bindUniformBuffersCmds[0]->data.bindUniformBuffers.standaloneUniformsBufferBinding;
// based on reflection, issue gl calls
- buffer.buffer->BindAsUniformBuffer( static_cast<const TestGraphicsProgram*>(pipeline->programState.program) );
+ buffer.buffer->BindAsUniformBuffer(static_cast<const TestGraphicsProgram*>(pipeline->programState.program));
}
- auto drawCmds = commandBuffer->GetCommandsByType( 0 |
- CommandType::DRAW |
- CommandType::DRAW_INDEXED_INDIRECT |
- CommandType::DRAW_INDEXED );
+ auto drawCmds = commandBuffer->GetCommandsByType(0 |
+ CommandType::DRAW |
+ CommandType::DRAW_INDEXED_INDIRECT |
+ CommandType::DRAW_INDEXED);
if(!drawCmds.empty())
{
- if (drawCmds[0]->draw.type == DrawCallDescriptor::Type::DRAW_INDEXED )
+ if(drawCmds[0]->data.draw.type == DrawCallDescriptor::Type::DRAW_INDEXED)
{
mGl.DrawElements(GetTopology(topology),
- static_cast<GLsizei>(drawCmds[0]->draw.drawIndexed.indexCount),
+ static_cast<GLsizei>(drawCmds[0]->data.draw.drawIndexed.indexCount),
GL_UNSIGNED_SHORT,
- reinterpret_cast<void *>(drawCmds[0]->draw.drawIndexed.firstIndex));
+ reinterpret_cast<void*>(drawCmds[0]->data.draw.drawIndexed.firstIndex));
}
else
{
- mGl.DrawArrays(GetTopology(topology), 0, drawCmds[0]->draw.draw.vertexCount);
+ mGl.DrawArrays(GetTopology(topology), 0, drawCmds[0]->data.draw.draw.vertexCount);
}
}
// attribute clear
- for (auto &attribute : vi.attributes)
+ for(auto& attribute : vi.attributes)
{
mGl.DisableVertexAttribArray(attribute.location);
}
bool found = true;
for(auto& shader : *(programCreateInfo.shaderState))
{
- auto graphicsShader = Uncast<TestGraphicsShader>(shader.shader);
- if(memcmp(cacheEntry.shaders[shader.pipelineStage], graphicsShader->mCreateInfo.sourceData, graphicsShader->mCreateInfo.sourceSize))
+ auto graphicsShader = Uncast<TestGraphicsShader>(shader.shader);
+ std::vector<uint8_t> source;
+ source.resize(graphicsShader->mCreateInfo.sourceSize);
+ memcpy(&source[0], graphicsShader->mCreateInfo.sourceData, graphicsShader->mCreateInfo.sourceSize);
+
+ if(!std::equal(source.begin(), source.end(), cacheEntry.shaders[shader.pipelineStage].begin()))
{
found = false;
break;
mProgramCache.back().programImpl = new TestGraphicsProgramImpl(mGl, programCreateInfo, mVertexFormats, mCustomUniforms);
for(auto& shader : *(programCreateInfo.shaderState))
{
- auto graphicsShader = Uncast<TestGraphicsShader>(shader.shader);
- mProgramCache.back().shaders[shader.pipelineStage] = graphicsShader->mCreateInfo.sourceData;
+ auto graphicsShader = Uncast<TestGraphicsShader>(shader.shader);
+ mProgramCache.back().shaders[shader.pipelineStage].resize(graphicsShader->mCreateInfo.sourceSize);
+ memcpy(&mProgramCache.back().shaders[shader.pipelineStage][0], graphicsShader->mCreateInfo.sourceData, graphicsShader->mCreateInfo.sourceSize);
}
return Graphics::MakeUnique<TestGraphicsProgram>(mProgramCache.back().programImpl);
}