mirror of
https://github.com/Yours3lf/rpi-vk-driver.git
synced 2025-02-19 16:54:18 +01:00
added some state change funcs
This commit is contained in:
parent
b2af56c5c6
commit
408d0a2b2a
@ -109,6 +109,29 @@ VKAPI_ATTR VkResult VKAPI_CALL vkAllocateCommandBuffers(
|
||||
clInit(&pCommandBuffers[c]->shaderRecCl, consecutivePoolAllocate(&cp->cpa, 1));
|
||||
clInit(&pCommandBuffers[c]->uniformsCl, consecutivePoolAllocate(&cp->cpa, 1));
|
||||
|
||||
pCommandBuffers[c]->renderPass = 0;
|
||||
pCommandBuffers[c]->fbo = 0;
|
||||
pCommandBuffers[c]->currentSubpass = 0;
|
||||
pCommandBuffers[c]->graphicsPipeline = 0;
|
||||
pCommandBuffers[c]->computePipeline = 0;
|
||||
pCommandBuffers[c]->firstDraw = 1;
|
||||
pCommandBuffers[c]->vertexBufferDirty = 1;
|
||||
pCommandBuffers[c]->indexBufferDirty = 1;
|
||||
pCommandBuffers[c]->viewportDirty = 1;
|
||||
pCommandBuffers[c]->lineWidthDirty = 1;
|
||||
pCommandBuffers[c]->depthBiasDirty = 1;
|
||||
pCommandBuffers[c]->graphicsPipelineDirty = 1;
|
||||
pCommandBuffers[c]->computePipelineDirty = 1;
|
||||
pCommandBuffers[c]->subpassDirty = 1;
|
||||
pCommandBuffers[c]->blendConstantsDirty = 1;
|
||||
pCommandBuffers[c]->scissorDirty = 1;
|
||||
pCommandBuffers[c]->depthBoundsDirty = 1;
|
||||
pCommandBuffers[c]->stencilCompareMaskDirty = 1;
|
||||
pCommandBuffers[c]->stencilWriteMaskDirty = 1;
|
||||
pCommandBuffers[c]->stencilReferenceDirty = 1;
|
||||
pCommandBuffers[c]->descriptorSetDirty = 1;
|
||||
pCommandBuffers[c]->pushConstantDirty = 1;
|
||||
|
||||
if(!pCommandBuffers[c]->binCl.buffer)
|
||||
{
|
||||
res = VK_ERROR_OUT_OF_HOST_MEMORY;
|
||||
|
@ -47,50 +47,6 @@ uint32_t packVec4IntoABGR8(const float rgba[4])
|
||||
return res;
|
||||
}
|
||||
|
||||
/*
|
||||
* https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#vkCmdClearColorImage
|
||||
* Color and depth/stencil images can be cleared outside a render pass instance using vkCmdClearColorImage or vkCmdClearDepthStencilImage, respectively.
|
||||
* These commands are only allowed outside of a render pass instance.
|
||||
*/
|
||||
VKAPI_ATTR void VKAPI_CALL vkCmdClearColorImage(
|
||||
VkCommandBuffer commandBuffer,
|
||||
VkImage image,
|
||||
VkImageLayout imageLayout,
|
||||
const VkClearColorValue* pColor,
|
||||
uint32_t rangeCount,
|
||||
const VkImageSubresourceRange* pRanges)
|
||||
{
|
||||
assert(commandBuffer);
|
||||
assert(image);
|
||||
assert(pColor);
|
||||
|
||||
//TODO this should only flag an image for clearing. This can only be called outside a renderpass
|
||||
//actual clearing would only happen:
|
||||
// -if image is rendered to (insert clear before first draw call)
|
||||
// -if the image is bound for sampling (submit a CL with a clear)
|
||||
// -if a command buffer is submitted without any rendering (insert clear)
|
||||
// -etc.
|
||||
//we shouldn't clear an image if noone uses it
|
||||
|
||||
//TODO ranges support
|
||||
|
||||
assert(imageLayout == VK_IMAGE_LAYOUT_GENERAL ||
|
||||
imageLayout == VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR ||
|
||||
imageLayout == VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
|
||||
|
||||
assert(commandBuffer->state == CMDBUF_STATE_RECORDING);
|
||||
assert(_queueFamilyProperties[commandBuffer->cp->queueFamilyIndex].queueFlags & VK_QUEUE_GRAPHICS_BIT || _queueFamilyProperties[commandBuffer->cp->queueFamilyIndex].queueFlags & VK_QUEUE_COMPUTE_BIT);
|
||||
|
||||
_image* i = image;
|
||||
|
||||
assert(i->usageBits & VK_IMAGE_USAGE_TRANSFER_DST_BIT);
|
||||
|
||||
//TODO externally sync cmdbuf, cmdpool
|
||||
|
||||
i->needToClear = 1;
|
||||
i->clearColor[0] = i->clearColor[1] = packVec4IntoABGR8(pColor->float32);
|
||||
}
|
||||
|
||||
int findInstanceExtension(char* name)
|
||||
{
|
||||
for(int c = 0; c < numInstanceExtensions; ++c)
|
||||
|
@ -263,6 +263,38 @@ typedef struct VkCommandBuffer_T
|
||||
_pipeline* graphicsPipeline;
|
||||
_pipeline* computePipeline;
|
||||
|
||||
uint32_t firstDraw; //so we can set tile binning config etc.
|
||||
|
||||
uint32_t vertexBufferDirty;
|
||||
uint32_t indexBufferDirty;
|
||||
uint32_t viewportDirty;
|
||||
uint32_t lineWidthDirty;
|
||||
uint32_t depthBiasDirty;
|
||||
uint32_t graphicsPipelineDirty;
|
||||
uint32_t computePipelineDirty;
|
||||
uint32_t subpassDirty;
|
||||
uint32_t blendConstantsDirty;
|
||||
uint32_t scissorDirty;
|
||||
uint32_t depthBoundsDirty;
|
||||
uint32_t stencilCompareMaskDirty;
|
||||
uint32_t stencilWriteMaskDirty;
|
||||
uint32_t stencilReferenceDirty;
|
||||
uint32_t descriptorSetDirty;
|
||||
uint32_t pushConstantDirty;
|
||||
|
||||
VkViewport viewport;
|
||||
VkRect2D scissor;
|
||||
float lineWidth;
|
||||
float depthBiasConstantFactor;
|
||||
float depthBiasClamp;
|
||||
float depthBiasSlopeFactor;
|
||||
float blendConstants[4];
|
||||
float minDepthBounds;
|
||||
float maxDepthBounds;
|
||||
uint32_t stencilCompareMask[2];
|
||||
uint32_t stencilWriteMask[2];
|
||||
uint32_t stencilReference[2];
|
||||
|
||||
uint32_t vertexBufferOffsets[8];
|
||||
_buffer* vertexBuffers[8];
|
||||
} _commandBuffer;
|
||||
|
@ -7,7 +7,17 @@
|
||||
*/
|
||||
void vkCmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint32_t viewportCount, const VkViewport* pViewports)
|
||||
{
|
||||
//TODO
|
||||
assert(commandBuffer);
|
||||
assert(firstViewport == 0);
|
||||
assert(viewportCount == 1);
|
||||
assert(pViewports);
|
||||
|
||||
//only 1 viewport is supported
|
||||
|
||||
_commandBuffer* cb = commandBuffer;
|
||||
cb->viewport = pViewports[0];
|
||||
|
||||
cb->viewportDirty = 1;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -15,7 +25,17 @@ void vkCmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport, uin
|
||||
*/
|
||||
void vkCmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_t scissorCount, const VkRect2D* pScissors)
|
||||
{
|
||||
//TODO
|
||||
assert(commandBuffer);
|
||||
assert(firstScissor == 0);
|
||||
assert(scissorCount == 1);
|
||||
assert(pScissors);
|
||||
|
||||
//only 1 scissor supported
|
||||
|
||||
_commandBuffer* cb = commandBuffer;
|
||||
cb->scissor = pScissors[0];
|
||||
|
||||
cb->scissorDirty = 1;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -32,4 +52,264 @@ void vkCmdBindVertexBuffers(VkCommandBuffer commandBuffer, uint32_t firstBinding
|
||||
cb->vertexBuffers[firstBinding + c] = pBuffers[c];
|
||||
cb->vertexBufferOffsets[firstBinding + c] = pOffsets[c];
|
||||
}
|
||||
|
||||
cb->vertexBufferDirty = 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#vkCmdClearColorImage
|
||||
* Color and depth/stencil images can be cleared outside a render pass instance using vkCmdClearColorImage or vkCmdClearDepthStencilImage, respectively.
|
||||
* These commands are only allowed outside of a render pass instance.
|
||||
*/
|
||||
VKAPI_ATTR void VKAPI_CALL vkCmdClearColorImage(
|
||||
VkCommandBuffer commandBuffer,
|
||||
VkImage image,
|
||||
VkImageLayout imageLayout,
|
||||
const VkClearColorValue* pColor,
|
||||
uint32_t rangeCount,
|
||||
const VkImageSubresourceRange* pRanges)
|
||||
{
|
||||
assert(commandBuffer);
|
||||
assert(image);
|
||||
assert(pColor);
|
||||
|
||||
//TODO this should only flag an image for clearing. This can only be called outside a renderpass
|
||||
//actual clearing would only happen:
|
||||
// -if image is rendered to (insert clear before first draw call)
|
||||
// -if the image is bound for sampling (submit a CL with a clear)
|
||||
// -if a command buffer is submitted without any rendering (insert clear)
|
||||
// -etc.
|
||||
//we shouldn't clear an image if noone uses it
|
||||
|
||||
//TODO ranges support
|
||||
|
||||
assert(imageLayout == VK_IMAGE_LAYOUT_GENERAL ||
|
||||
imageLayout == VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR ||
|
||||
imageLayout == VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
|
||||
|
||||
assert(commandBuffer->state == CMDBUF_STATE_RECORDING);
|
||||
assert(_queueFamilyProperties[commandBuffer->cp->queueFamilyIndex].queueFlags & VK_QUEUE_GRAPHICS_BIT || _queueFamilyProperties[commandBuffer->cp->queueFamilyIndex].queueFlags & VK_QUEUE_COMPUTE_BIT);
|
||||
|
||||
_image* i = image;
|
||||
|
||||
assert(i->usageBits & VK_IMAGE_USAGE_TRANSFER_DST_BIT);
|
||||
|
||||
//TODO externally sync cmdbuf, cmdpool
|
||||
|
||||
i->needToClear = 1;
|
||||
i->clearColor[0] = i->clearColor[1] = packVec4IntoABGR8(pColor->float32);
|
||||
}
|
||||
|
||||
/*
|
||||
* https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#vkCmdClearDepthStencilImage
|
||||
*/
|
||||
VKAPI_ATTR void VKAPI_CALL vkCmdClearDepthStencilImage(
|
||||
VkCommandBuffer commandBuffer,
|
||||
VkImage image,
|
||||
VkImageLayout imageLayout,
|
||||
const VkClearDepthStencilValue* pDepthStencil,
|
||||
uint32_t rangeCount,
|
||||
const VkImageSubresourceRange* pRanges)
|
||||
{
|
||||
assert(commandBuffer);
|
||||
assert(image);
|
||||
assert(pDepthStencil);
|
||||
|
||||
//TODO
|
||||
}
|
||||
|
||||
/*
|
||||
* https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#vkCmdClearAttachments
|
||||
*/
|
||||
VKAPI_ATTR void VKAPI_CALL vkCmdClearAttachments(
|
||||
VkCommandBuffer commandBuffer,
|
||||
uint32_t attachmentCount,
|
||||
const VkClearAttachment* pAttachments,
|
||||
uint32_t rectCount,
|
||||
const VkClearRect* pRects)
|
||||
{
|
||||
assert(commandBuffer);
|
||||
assert(pAttachments);
|
||||
assert(pRects);
|
||||
|
||||
//TODO
|
||||
}
|
||||
|
||||
/*
|
||||
* https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#vkCmdFillBuffer
|
||||
*/
|
||||
VKAPI_ATTR void VKAPI_CALL vkCmdFillBuffer(
|
||||
VkCommandBuffer commandBuffer,
|
||||
VkBuffer dstBuffer,
|
||||
VkDeviceSize dstOffset,
|
||||
VkDeviceSize size,
|
||||
uint32_t data)
|
||||
{
|
||||
//TODO
|
||||
}
|
||||
|
||||
/*
|
||||
* https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#vkCmdUpdateBuffer
|
||||
*/
|
||||
VKAPI_ATTR void VKAPI_CALL vkCmdUpdateBuffer(
|
||||
VkCommandBuffer commandBuffer,
|
||||
VkBuffer dstBuffer,
|
||||
VkDeviceSize dstOffset,
|
||||
VkDeviceSize dataSize,
|
||||
const void* pData)
|
||||
{
|
||||
//TODO
|
||||
}
|
||||
|
||||
/*
|
||||
* https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#vkCmdBindIndexBuffer
|
||||
*/
|
||||
VKAPI_ATTR void VKAPI_CALL vkCmdBindIndexBuffer(
|
||||
VkCommandBuffer commandBuffer,
|
||||
VkBuffer buffer,
|
||||
VkDeviceSize offset,
|
||||
VkIndexType indexType)
|
||||
{
|
||||
//TODO
|
||||
}
|
||||
|
||||
/*
|
||||
* https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#vkCmdSetLineWidth
|
||||
*/
|
||||
VKAPI_ATTR void VKAPI_CALL vkCmdSetLineWidth(
|
||||
VkCommandBuffer commandBuffer,
|
||||
float lineWidth)
|
||||
{
|
||||
assert(commandBuffer);
|
||||
|
||||
_commandBuffer* cb = commandBuffer;
|
||||
cb->lineWidth = lineWidth;
|
||||
|
||||
cb->lineWidthDirty = 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#vkCmdSetDepthBias
|
||||
*/
|
||||
VKAPI_ATTR void VKAPI_CALL vkCmdSetDepthBias(
|
||||
VkCommandBuffer commandBuffer,
|
||||
float depthBiasConstantFactor,
|
||||
float depthBiasClamp,
|
||||
float depthBiasSlopeFactor)
|
||||
{
|
||||
assert(commandBuffer);
|
||||
|
||||
_commandBuffer* cb = commandBuffer;
|
||||
cb->depthBiasConstantFactor = depthBiasConstantFactor;
|
||||
cb->depthBiasClamp = depthBiasClamp;
|
||||
cb->depthBiasSlopeFactor = depthBiasSlopeFactor;
|
||||
|
||||
cb->depthBiasDirty = 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#vkCmdSetBlendConstants
|
||||
*/
|
||||
VKAPI_ATTR void VKAPI_CALL vkCmdSetBlendConstants(
|
||||
VkCommandBuffer commandBuffer,
|
||||
const float blendConstants[4])
|
||||
{
|
||||
assert(commandBuffer);
|
||||
|
||||
_commandBuffer* cb = commandBuffer;
|
||||
memcpy(cb->blendConstants, blendConstants, 4 * sizeof(float));
|
||||
|
||||
cb->blendConstantsDirty = 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#vkCmdSetDepthBounds
|
||||
*/
|
||||
VKAPI_ATTR void VKAPI_CALL vkCmdSetDepthBounds(
|
||||
VkCommandBuffer commandBuffer,
|
||||
float minDepthBounds,
|
||||
float maxDepthBounds)
|
||||
{
|
||||
assert(commandBuffer);
|
||||
|
||||
_commandBuffer* cb = commandBuffer;
|
||||
cb->minDepthBounds = minDepthBounds;
|
||||
cb->maxDepthBounds = maxDepthBounds;
|
||||
|
||||
cb->depthBoundsDirty = 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#vkCmdSetStencilCompareMask
|
||||
*/
|
||||
VKAPI_ATTR void VKAPI_CALL vkCmdSetStencilCompareMask(
|
||||
VkCommandBuffer commandBuffer,
|
||||
VkStencilFaceFlags faceMask,
|
||||
uint32_t compareMask)
|
||||
{
|
||||
assert(commandBuffer);
|
||||
|
||||
_commandBuffer* cb = commandBuffer;
|
||||
|
||||
if(faceMask & VK_STENCIL_FACE_FRONT_BIT)
|
||||
{
|
||||
cb->stencilCompareMask[0] = compareMask;
|
||||
}
|
||||
|
||||
if(faceMask & VK_STENCIL_FACE_BACK_BIT)
|
||||
{
|
||||
cb->stencilCompareMask[1] = compareMask;
|
||||
}
|
||||
|
||||
cb->stencilCompareMaskDirty = 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#vkCmdSetStencilWriteMask
|
||||
*/
|
||||
VKAPI_ATTR void VKAPI_CALL vkCmdSetStencilWriteMask(
|
||||
VkCommandBuffer commandBuffer,
|
||||
VkStencilFaceFlags faceMask,
|
||||
uint32_t writeMask)
|
||||
{
|
||||
assert(commandBuffer);
|
||||
|
||||
_commandBuffer* cb = commandBuffer;
|
||||
|
||||
if(faceMask & VK_STENCIL_FACE_FRONT_BIT)
|
||||
{
|
||||
cb->stencilWriteMask[0] = writeMask;
|
||||
}
|
||||
|
||||
if(faceMask & VK_STENCIL_FACE_BACK_BIT)
|
||||
{
|
||||
cb->stencilWriteMask[1] = writeMask;
|
||||
}
|
||||
|
||||
cb->stencilWriteMaskDirty = 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#vkCmdSetStencilReference
|
||||
*/
|
||||
VKAPI_ATTR void VKAPI_CALL vkCmdSetStencilReference(
|
||||
VkCommandBuffer commandBuffer,
|
||||
VkStencilFaceFlags faceMask,
|
||||
uint32_t reference)
|
||||
{
|
||||
assert(commandBuffer);
|
||||
|
||||
_commandBuffer* cb = commandBuffer;
|
||||
|
||||
if(faceMask & VK_STENCIL_FACE_FRONT_BIT)
|
||||
{
|
||||
cb->stencilReference[0] = reference;
|
||||
}
|
||||
|
||||
if(faceMask & VK_STENCIL_FACE_BACK_BIT)
|
||||
{
|
||||
cb->stencilReference[1] = reference;
|
||||
}
|
||||
|
||||
cb->stencilReferenceDirty = 1;
|
||||
}
|
||||
|
@ -68,7 +68,7 @@ static VkPhysicalDeviceLimits _limits =
|
||||
.maxDrawIndirectCount = 4294967295,
|
||||
.maxSamplerLodBias = 15,
|
||||
.maxSamplerAnisotropy = 16.0,
|
||||
.maxViewports = 16,
|
||||
.maxViewports = 1,
|
||||
.maxViewportDimensions = {16384,16384},
|
||||
.viewportBoundsRange = {-32768,32768},
|
||||
.viewportSubPixelBits = 8,
|
||||
|
Loading…
x
Reference in New Issue
Block a user