JBR-7256 Vulkan: Implement FILL_PARALLELOGRAM primitive for flat color rendering

(cherry picked from commit 57dc1a9e23)
This commit is contained in:
Alexey Ushakov
2024-06-04 22:30:06 +02:00
committed by jbrbot
parent a0138a414f
commit ec4a5e12ae
6 changed files with 98 additions and 71 deletions

View File

@@ -1,10 +1,13 @@
#version 450
layout(push_constant) uniform PushConstants {
vec4 fragColor;
} pushConstants;
layout(location = 0) in vec2 inPosition;
layout(location = 1) in vec4 inColor;
layout(location = 0) out flat vec4 fragColor;
void main() {
gl_Position = vec4(inPosition, 0.0, 1.0);
fragColor = inColor;
fragColor = pushConstants.fragColor;
}

View File

@@ -207,6 +207,67 @@ JNIEXPORT void JNICALL Java_sun_java2d_vulkan_VKRenderQueue_flushBuffer
J2dRlsTraceLn6(J2D_TRACE_VERBOSE,
"VKRenderQueue_flushBuffer: FILL_PARALLELOGRAM(%f, %f, %f, %f, %f, %f)",
x11, y11, dx21, dy21, dx12, dy12);
if (dstOps != NULL) {
VKSDOps *vksdOps = (VKSDOps *)dstOps;
VKGraphicsEnvironment* ge = VKGE_graphics_environment();
VKLogicalDevice* logicalDevice = &ge->devices[ge->enabledDeviceNum];
float width = vksdOps->width;
float height = vksdOps->height;
J2dRlsTraceLn2(J2D_TRACE_VERBOSE,
"VKRenderQueue_flushBuffer: FILL_PARALLELOGRAM(W=%f, H=%f)",
width, height);
VKVertex* vertices = ARRAY_ALLOC(VKVertex, 4);
/* dx21
* (p1)---------(p2) | (p1)------
* |\ \ | | \ dy21
* | \ \ | dy12 | \
* | \ \| | (p2)-
* | (p4)---------(p3) (p4) |
* dx12 \ | dy12
* dy21 \ |
* -----(p3)
*/
float p1x = -1.0f + x11 / width;
float p1y = -1.0f + y11 / height;
float p2x = -1.0f + (x11 + dx21) / width;
float p2y = -1.0f + (y11 + dy21) / height;
float p3x = -1.0f + (x11 + dx21 + dx12) / width;
float p3y = -1.0f + (y11 + dy21 + dy12) / height;
float p4x = -1.0f + (x11 + dx12) / width;
float p4y = -1.0f + (y11 + dy12) / height;
ARRAY_PUSH_BACK(&vertices, ((VKVertex){p1x,p1y}));
ARRAY_PUSH_BACK(&vertices, ((VKVertex){p2x,p2y}));
ARRAY_PUSH_BACK(&vertices, ((VKVertex){p4x,p4y}));
ARRAY_PUSH_BACK(&vertices, ((VKVertex){p3x,p3y}));
VKBuffer* fillVertexBuffer = ARRAY_TO_VERTEX_BUF(vertices);
if (!fillVertexBuffer) {
J2dRlsTrace(J2D_TRACE_ERROR, "Cannot create vertex buffer\n")
break;
}
ARRAY_FREE(vertices);
ge->vkWaitForFences(logicalDevice->device, 1, &logicalDevice->inFlightFence, VK_TRUE, UINT64_MAX);
ge->vkResetFences(logicalDevice->device, 1, &logicalDevice->inFlightFence);
ge->vkResetCommandBuffer(logicalDevice->commandBuffer, 0);
VKRenderer_BeginRendering();
VKRenderer_ColorRender(
vksdOps->image,
color,
fillVertexBuffer->buffer, 4
);
VKRenderer_EndRendering(VK_FALSE, VK_FALSE);
}
}
break;
case sun_java2d_pipe_BufferedOpCodes_FILL_AAPARALLELOGRAM:
@@ -220,59 +281,6 @@ JNIEXPORT void JNICALL Java_sun_java2d_vulkan_VKRenderQueue_flushBuffer
J2dRlsTraceLn6(J2D_TRACE_VERBOSE,
"VKRenderQueue_flushBuffer: FILL_AAPARALLELOGRAM(%f, %f, %f, %f, %f, %f)",
x11, y11, dx21, dy21, dx12, dy12);
// TODO: For now rendering bounding box. Implement correct rendering using shaders
if (dstOps != NULL) {
VKSDOps *vksdOps = (VKSDOps *)dstOps;
VKGraphicsEnvironment* ge = VKGE_graphics_environment();
VKLogicalDevice* logicalDevice = &ge->devices[ge->enabledDeviceNum];
float width = vksdOps->width;
float height = vksdOps->height;
J2dRlsTraceLn2(J2D_TRACE_VERBOSE,
"VKRenderQueue_flushBuffer: FILL_AAPARALLELOGRAM(W=%f, H=%f)",
width, height);
VKCVertex* cVertices = ARRAY_ALLOC(VKCVertex, 4);
float px11 = -1.0f + x11 / width;
float py11 = -1.0f + y11 / height;
float px21 = -1.0f + (x11 + dx21) / width;
float py21 = -1.0f + (y11 + dy21) / height;
ARRAY_PUSH_BACK(&cVertices, ((VKCVertex){px11,
py11,
RGBA_TO_L4(color)}));
ARRAY_PUSH_BACK(&cVertices, ((VKCVertex){px21,
py11,
RGBA_TO_L4(color)}));
ARRAY_PUSH_BACK(&cVertices, ((VKCVertex){px11,
py21,
RGBA_TO_L4(color)}));
ARRAY_PUSH_BACK(&cVertices, ((VKCVertex){px21,
py21,
RGBA_TO_L4(color)}));
J2dRlsTraceLn5(J2D_TRACE_VERBOSE,
"VKRenderQueue_flushBuffer: FILL_AAPARALLELOGRAM(color=%x, px11=%f, py11=%f, px21=%f, py21=%f)",
color, px11, py11, px21, py21);
VKBuffer* fillVertexBuffer = ARRAY_TO_VERTEX_BUF(cVertices);
if (!fillVertexBuffer) {
J2dRlsTrace(J2D_TRACE_ERROR, "Cannot create vertex buffer\n")
break;
}
ARRAY_FREE(cVertices);
ge->vkWaitForFences(logicalDevice->device, 1, &logicalDevice->inFlightFence, VK_TRUE, UINT64_MAX);
ge->vkResetFences(logicalDevice->device, 1, &logicalDevice->inFlightFence);
ge->vkResetCommandBuffer(logicalDevice->commandBuffer, 0);
VKRenderer_BeginRendering();
VKRenderer_ColorRender(
vksdOps->image,
fillVertexBuffer->buffer, 4
);
VKRenderer_EndRendering(VK_FALSE, VK_FALSE);
}
}
break;

View File

@@ -352,7 +352,7 @@ VKRenderer* VKRenderer_CreateFillColorPoly() {
};
VkPipelineShaderStageCreateInfo shaderStages[] = {vertShaderStageInfo, fragShaderStageInfo};
VKVertexDescr vertexDescr = VKVertex_GetCVertexDescr();
VKVertexDescr vertexDescr = VKVertex_GetVertexDescr();
VkPipelineVertexInputStateCreateInfo vertexInputInfo = {
.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO,
.vertexBindingDescriptionCount = vertexDescr.bindingDescriptionCount,
@@ -423,10 +423,17 @@ VKRenderer* VKRenderer_CreateFillColorPoly() {
.pDynamicStates = dynamicStates
};
VkPushConstantRange pushConstantRange = {
.stageFlags = VK_SHADER_STAGE_VERTEX_BIT,
.offset = 0,
.size = sizeof(float) * 4
};
VkPipelineLayoutCreateInfo pipelineLayoutInfo = {
.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO,
.setLayoutCount = 0,
.pushConstantRangeCount = 0
.pushConstantRangeCount = 1,
.pPushConstantRanges = &pushConstantRange
};
if (ge->vkCreatePipelineLayout(device, &pipelineLayoutInfo, NULL,
@@ -727,7 +734,7 @@ void VKRenderer_TextureRender(VKImage *destImage, VKImage *srcImage, VkBuffer ve
}
void VKRenderer_ColorRender(VKImage *destImage, VkBuffer vertexBuffer, uint32_t vertexNum)
void VKRenderer_ColorRender(VKImage *destImage, uint32_t rgba, VkBuffer vertexBuffer, uint32_t vertexNum)
{
VKGraphicsEnvironment* ge = VKGE_graphics_environment();
VKLogicalDevice* logicalDevice = &ge->devices[ge->enabledDeviceNum];
@@ -748,6 +755,21 @@ void VKRenderer_ColorRender(VKImage *destImage, VkBuffer vertexBuffer, uint32_t
ge->vkCmdBindPipeline(logicalDevice->commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS,
logicalDevice->fillColorPoly->graphicsPipeline);
struct PushConstants {
float r, g, b, a;
} pushConstants;
pushConstants = (struct PushConstants){RGBA_TO_L4(rgba)};
ge->vkCmdPushConstants(
logicalDevice->commandBuffer,
logicalDevice->fillColorPoly->pipelineLayout,
VK_SHADER_STAGE_VERTEX_BIT,
0,
sizeof(struct PushConstants),
&pushConstants
);
VkBuffer vertexBuffers[] = {vertexBuffer};
VkDeviceSize offsets[] = {0};
ge->vkCmdBindVertexBuffers(logicalDevice->commandBuffer, 0, 1, vertexBuffers, offsets);

View File

@@ -40,7 +40,7 @@ VKRenderer* VKRenderer_CreateFillMaxColorPoly();
void VKRenderer_BeginRendering();
void VKRenderer_EndRendering(VkBool32 notifyRenderFinish, VkBool32 waitForDisplayImage);
void VKRenderer_TextureRender(VKImage *destImage, VKImage *srcImage, VkBuffer vertexBuffer, uint32_t vertexNum);
void VKRenderer_ColorRender(VKImage *destImage, VkBuffer vertexBuffer, uint32_t vertexNum);
void VKRenderer_ColorRender(VKImage *destImage, uint32_t rgba, VkBuffer vertexBuffer, uint32_t vertexNum);
void VKRenderer_ColorRenderMaxRect(VKImage *destImage, uint32_t rgba);
// fill ops
void VKRenderer_FillRect(jint x, jint y, jint w, jint h);

View File

@@ -62,11 +62,11 @@ VKVertexDescr VKVertex_GetTxVertexDescr() {
};
}
VKVertexDescr VKVertex_GetCVertexDescr() {
VKVertexDescr VKVertex_GetVertexDescr() {
static VkVertexInputBindingDescription bindingDescriptions[] = {
{
.binding = 0,
.stride = sizeof(VKCVertex),
.stride = sizeof(VKVertex),
.inputRate = VK_VERTEX_INPUT_RATE_VERTEX
}
};
@@ -76,13 +76,7 @@ VKVertexDescr VKVertex_GetCVertexDescr() {
.binding = 0,
.location = 0,
.format = VK_FORMAT_R32G32_SFLOAT,
.offset = offsetof(VKCVertex, px)
},
{
.binding = 0,
.location = 1,
.format = VK_FORMAT_R32G32B32A32_SFLOAT,
.offset = offsetof(VKCVertex, r)
.offset = offsetof(VKVertex, px)
}
};

View File

@@ -53,11 +53,11 @@ typedef struct {
typedef struct {
float px, py;
float r, g, b, a;
} VKCVertex;
} VKVertex;
VKVertexDescr VKVertex_GetTxVertexDescr();
VKVertexDescr VKVertex_GetCVertexDescr();
VKVertexDescr VKVertex_GetVertexDescr();