JBR-8418 Vulkan: RenderPerfTest Image test does not work properly

Passed transform to VKRenderer code
This commit is contained in:
Alexey Ushakov
2025-03-11 12:35:15 +01:00
parent ed1fe6b68f
commit 380bc8151d
4 changed files with 59 additions and 6 deletions

View File

@@ -530,14 +530,24 @@ JNIEXPORT void JNICALL Java_sun_java2d_vulkan_VKRenderQueue_flushBuffer
.m11 = m11, .m02 = m02, .m12 = m12
};
VKRenderer_GetContext()->transform = transform;
if (VKRenderer_GetContext()->surface != NULL &&
VK_IS_NEQ_TRANSFORM(&VKRenderer_GetContext()->transform, &transform))
{
VKRenderer_FlushSurface(VKRenderer_GetContext()->surface);
VKRenderer_GetContext()->transform = transform;
}
}
break;
case sun_java2d_pipe_BufferedOpCodes_RESET_TRANSFORM:
{
J2dRlsTraceLn(J2D_TRACE_VERBOSE,
"VKRenderQueue_flushBuffer: RESET_TRANSFORM")
"VKRenderQueue_flushBuffer: RESET_TRANSFORM");
if (VKRenderer_GetContext()->surface != NULL &&
VK_IS_NEQ_TRANSFORM(&VKRenderer_GetContext()->transform, &VK_ID_TRANSFORM))
{
VKRenderer_FlushSurface(VKRenderer_GetContext()->surface);
VKRenderer_GetContext()->transform = VK_ID_TRANSFORM;
}
}
break;

View File

@@ -758,12 +758,16 @@ static void VKRenderer_BeginRenderPass(VKSDOps* surface) {
.maxDepth = 1.0f
};
device->vkCmdSetViewport(commandBuffer, 0, 1, &viewport);
// Calculate inverse viewport for vertex shader.
// Calculate user to device transform
VKTransform transform = {
2.0f/viewport.width,0.0f, -1.0f,
0.0f,2.0f/viewport.height, -1.0f
2.0f/viewport.width, 0.0f, -1.0f,
0.0f, 2.0f/viewport.height, -1.0f
};
// Combine it with user transform
VKUtil_ConcatenateTransform(&transform, &context.transform);
device->vkCmdPushConstants(
commandBuffer,
renderer->pipelineContext->colorPipelineLayout, // TODO what if our pipeline layout differs?

View File

@@ -311,3 +311,24 @@ void VKUtil_LogResultError(const char* string, VkResult result) {
}
J2dRlsTraceLn1(J2D_TRACE_ERROR, string, r)
}
/**
* Concatenate src transform to dst
* [d00 d01 d02] [s00 s01 s02] [d00s00+d01s10 d00s01+d01s11 d00s02+d01s12+d02]
* [d10 d11 d12] [s10 s11 s12] = [d10s11+d11s10 d10s01+d11s11 d10s02+d11s12+d12]
* [ 0 0 1 ] [ 0 0 1 ] [ 0 0 1 ]
*/
void VKUtil_ConcatenateTransform(VKTransform* dst, const VKTransform* src) {
float s00 = src->m00, s01 = src->m01, s02 = src->m02;
float s10 = src->m10, s11 = src->m11, s12 = src->m12;
float d00 = dst->m00, d01 = dst->m01, d02 = dst->m02;
float d10 = dst->m10, d11 = dst->m11, d12 = dst->m12;
dst->m00 = d00 * s00 + d01 * s10;
dst->m01 = d00 * s01 + d01 * s11;
dst->m02 = d00 * s02 + d01 * s12 + d02;
dst->m10 = d10 * s00 + d11 * s10;
dst->m11 = d10 * s01 + d11 * s11;
dst->m12 = d10 * s02 + d11 * s12 + d12;
}

View File

@@ -69,6 +69,19 @@ inline VkBool32 VKUtil_CheckError(VkResult result, const char* errorMessage) {
#define C_ARRAY_UTIL_ALLOCATION_FAILED() VK_FATAL_ERROR("CArrayUtil allocation failed")
#include "CArrayUtil.h"
#define VK_ID_TRANSFORM ((VKTransform)\
{1.0f, 0.0f, 0.0f, \
0.0f, 1.0f, 0.0f})
// 0.0f, 0.0f, 1.0f -- omitted values
#define VK_IS_NEQ_TRANSFORM(PA, PB) \
((PA)->m00 != (PB)->m00 || \
(PA)->m01 != (PB)->m01 || \
(PA)->m02 != (PB)->m02 || \
(PA)->m10 != (PB)->m10 || \
(PA)->m11 != (PB)->m11 || \
(PA)->m12 != (PB)->m12 )
typedef enum {
FORMAT_ALIAS_ORIGINAL = 0,
FORMAT_ALIAS_UNORM = 1,
@@ -113,6 +126,11 @@ uint32_t VKUtil_Log2(uint64_t i);
*/
FormatGroup VKUtil_GetFormatGroup(VkFormat format);
/**
* Apply src transform to dst
*/
void VKUtil_ConcatenateTransform(VKTransform* dst, const VKTransform* src);
/*
* The following macros allow the caller to return (or continue) if the
* provided value is NULL. (The strange else clause is included below to