Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Merged
merged 1 commit into from
Jun 13, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions src/java.desktop/share/glsl/vulkan/color.vert
Original file line number Diff line number Diff line change
@@ -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;
}
90 changes: 49 additions & 41 deletions src/java.desktop/share/native/common/java2d/vulkan/VKRenderQueue.c
Original file line number Diff line number Diff line change
Expand Up @@ -207,74 +207,82 @@ 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);
}
break;
case sun_java2d_pipe_BufferedOpCodes_FILL_AAPARALLELOGRAM:
{
jfloat x11 = NEXT_FLOAT(b);
jfloat y11 = NEXT_FLOAT(b);
jfloat dx21 = NEXT_FLOAT(b);
jfloat dy21 = NEXT_FLOAT(b);
jfloat dx12 = NEXT_FLOAT(b);
jfloat dy12 = NEXT_FLOAT(b);
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)",
"VKRenderQueue_flushBuffer: FILL_PARALLELOGRAM(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);
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(cVertices);
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);
ge->vkResetCommandBuffer(logicalDevice->commandBuffer, 0);

VKRenderer_BeginRendering();

VKRenderer_ColorRender(
vksdOps->image,
fillVertexBuffer->buffer, 4
vksdOps->image,
color,
fillVertexBuffer->buffer, 4
);

VKRenderer_EndRendering(VK_FALSE, VK_FALSE);
}
}
break;
case sun_java2d_pipe_BufferedOpCodes_FILL_AAPARALLELOGRAM:
{
jfloat x11 = NEXT_FLOAT(b);
jfloat y11 = NEXT_FLOAT(b);
jfloat dx21 = NEXT_FLOAT(b);
jfloat dy21 = NEXT_FLOAT(b);
jfloat dx12 = NEXT_FLOAT(b);
jfloat dy12 = NEXT_FLOAT(b);
J2dRlsTraceLn6(J2D_TRACE_VERBOSE,
"VKRenderQueue_flushBuffer: FILL_AAPARALLELOGRAM(%f, %f, %f, %f, %f, %f)",
x11, y11, dx21, dy21, dx12, dy12);
}
break;

// text-related ops
case sun_java2d_pipe_BufferedOpCodes_DRAW_GLYPH_LIST:
Expand Down
28 changes: 25 additions & 3 deletions src/java.desktop/share/native/common/java2d/vulkan/VKRenderer.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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];
Expand All @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
12 changes: 3 additions & 9 deletions src/java.desktop/share/native/common/java2d/vulkan/VKVertex.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
};
Expand All @@ -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)
}
};

Expand Down
6 changes: 3 additions & 3 deletions src/java.desktop/share/native/common/java2d/vulkan/VKVertex.h
Original file line number Diff line number Diff line change
Expand Up @@ -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();



Expand Down