mirror of
https://gitlab.freedesktop.org/monado/monado.git
synced 2024-12-28 02:26:16 +00:00
comp: Move VIVE distortion properties to UBO.
This commit is contained in:
parent
6f5ef7a0cb
commit
52e11ac4c5
|
@ -55,8 +55,7 @@ comp_distortion_init_pipeline_layout(struct comp_distortion *d);
|
||||||
static void
|
static void
|
||||||
comp_distortion_init_pipeline(struct comp_distortion *d,
|
comp_distortion_init_pipeline(struct comp_distortion *d,
|
||||||
VkRenderPass render_pass,
|
VkRenderPass render_pass,
|
||||||
VkPipelineCache pipeline_cache,
|
VkPipelineCache pipeline_cache);
|
||||||
enum xrt_distortion_model distortion_model);
|
|
||||||
|
|
||||||
static VkWriteDescriptorSet
|
static VkWriteDescriptorSet
|
||||||
comp_distortion_get_uniform_write_descriptor_set(struct comp_distortion *d,
|
comp_distortion_get_uniform_write_descriptor_set(struct comp_distortion *d,
|
||||||
|
@ -175,6 +174,8 @@ comp_distortion_init(struct comp_distortion *d,
|
||||||
{
|
{
|
||||||
d->vk = &c->vk;
|
d->vk = &c->vk;
|
||||||
|
|
||||||
|
d->distortion_model = distortion_model;
|
||||||
|
|
||||||
d->ubo_vp_data[0].flip_y = flip_y;
|
d->ubo_vp_data[0].flip_y = flip_y;
|
||||||
d->ubo_vp_data[1].flip_y = flip_y;
|
d->ubo_vp_data[1].flip_y = flip_y;
|
||||||
|
|
||||||
|
@ -182,8 +183,7 @@ comp_distortion_init(struct comp_distortion *d,
|
||||||
comp_distortion_update_uniform_buffer_warp(d, c);
|
comp_distortion_update_uniform_buffer_warp(d, c);
|
||||||
comp_distortion_init_descriptor_set_layout(d);
|
comp_distortion_init_descriptor_set_layout(d);
|
||||||
comp_distortion_init_pipeline_layout(d);
|
comp_distortion_init_pipeline_layout(d);
|
||||||
comp_distortion_init_pipeline(d, render_pass, pipeline_cache,
|
comp_distortion_init_pipeline(d, render_pass, pipeline_cache);
|
||||||
distortion_model);
|
|
||||||
comp_distortion_init_descriptor_sets(d, descriptor_pool);
|
comp_distortion_init_descriptor_sets(d, descriptor_pool);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -207,8 +207,7 @@ comp_distortion_destroy(struct comp_distortion *d)
|
||||||
static void
|
static void
|
||||||
comp_distortion_init_pipeline(struct comp_distortion *d,
|
comp_distortion_init_pipeline(struct comp_distortion *d,
|
||||||
VkRenderPass render_pass,
|
VkRenderPass render_pass,
|
||||||
VkPipelineCache pipeline_cache,
|
VkPipelineCache pipeline_cache)
|
||||||
enum xrt_distortion_model distortion_model)
|
|
||||||
{
|
{
|
||||||
struct vk_bundle *vk = d->vk;
|
struct vk_bundle *vk = d->vk;
|
||||||
VkResult ret;
|
VkResult ret;
|
||||||
|
@ -276,12 +275,10 @@ comp_distortion_init_pipeline(struct comp_distortion *d,
|
||||||
.pDynamicStates = dynamic_states,
|
.pDynamicStates = dynamic_states,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
const uint32_t *fragment_shader_code;
|
const uint32_t *fragment_shader_code;
|
||||||
size_t fragment_shader_size;
|
size_t fragment_shader_size;
|
||||||
|
|
||||||
switch (distortion_model) {
|
switch (d->distortion_model) {
|
||||||
case XRT_DISTORTION_MODEL_NONE:
|
case XRT_DISTORTION_MODEL_NONE:
|
||||||
fragment_shader_code = shaders_none_frag;
|
fragment_shader_code = shaders_none_frag;
|
||||||
fragment_shader_size = sizeof(shaders_none_frag);
|
fragment_shader_size = sizeof(shaders_none_frag);
|
||||||
|
@ -541,31 +538,54 @@ static void
|
||||||
comp_distortion_update_uniform_buffer_warp(struct comp_distortion *d,
|
comp_distortion_update_uniform_buffer_warp(struct comp_distortion *d,
|
||||||
struct comp_compositor *c)
|
struct comp_compositor *c)
|
||||||
{
|
{
|
||||||
/*
|
|
||||||
* Pano vision fragment shader
|
|
||||||
*/
|
|
||||||
|
|
||||||
// clang-format off
|
// clang-format off
|
||||||
d->ubo_pano.hmd_warp_param[0] = c->xdev->distortion.pano.distortion_k[0];
|
switch (d->distortion_model) {
|
||||||
d->ubo_pano.hmd_warp_param[1] = c->xdev->distortion.pano.distortion_k[1];
|
case XRT_DISTORTION_MODEL_VIVE:
|
||||||
d->ubo_pano.hmd_warp_param[2] = c->xdev->distortion.pano.distortion_k[2];
|
/*
|
||||||
d->ubo_pano.hmd_warp_param[3] = c->xdev->distortion.pano.distortion_k[3];
|
* VIVE fragment shader
|
||||||
d->ubo_pano.aberr[0] = c->xdev->distortion.pano.aberration_k[0];
|
*/
|
||||||
d->ubo_pano.aberr[1] = c->xdev->distortion.pano.aberration_k[1];
|
d->ubo_vive.aspect_x_over_y = c->xdev->distortion.vive.aspect_x_over_y;
|
||||||
d->ubo_pano.aberr[2] = c->xdev->distortion.pano.aberration_k[2];
|
d->ubo_vive.grow_for_undistort = c->xdev->distortion.vive.grow_for_undistort;
|
||||||
d->ubo_pano.aberr[3] = c->xdev->distortion.pano.aberration_k[3];
|
|
||||||
d->ubo_pano.lens_center[0][0] = c->xdev->views[0].lens_center.x_meters;
|
|
||||||
d->ubo_pano.lens_center[0][1] = c->xdev->views[0].lens_center.y_meters;
|
|
||||||
d->ubo_pano.lens_center[1][0] = c->xdev->views[1].lens_center.x_meters;
|
|
||||||
d->ubo_pano.lens_center[1][1] = c->xdev->views[1].lens_center.y_meters;
|
|
||||||
d->ubo_pano.viewport_scale[0] = c->xdev->views[0].display.w_meters;
|
|
||||||
d->ubo_pano.viewport_scale[1] = c->xdev->views[0].display.h_meters;
|
|
||||||
d->ubo_pano.warp_scale = c->xdev->distortion.pano.warp_scale;
|
|
||||||
|
|
||||||
memcpy(d->ubo_handle.mapped, &d->ubo_pano, sizeof(d->ubo_pano));
|
for (uint32_t i = 0; i < 2; i++)
|
||||||
|
d->ubo_vive.undistort_r2_cutoff[i] = c->xdev->distortion.vive.undistort_r2_cutoff[i];
|
||||||
|
|
||||||
|
for (uint32_t i = 0; i < 2; i++)
|
||||||
|
for (uint32_t j = 0; j < 2; j++)
|
||||||
|
d->ubo_vive.center[i][j] = c->xdev->distortion.vive.center[i][j];
|
||||||
|
|
||||||
|
for (uint32_t i = 0; i < 2; i++)
|
||||||
|
for (uint32_t j = 0; j < 3; j++)
|
||||||
|
for (uint32_t k = 0; k < 3; k++)
|
||||||
|
d->ubo_vive.coefficients[i][j][k] = c->xdev->distortion.vive.coefficients[i][j][k];
|
||||||
|
|
||||||
|
memcpy(d->ubo_handle.mapped, &d->ubo_vive, sizeof(d->ubo_vive));
|
||||||
|
break;
|
||||||
|
case XRT_DISTORTION_MODEL_PANOTOOLS:
|
||||||
|
default:
|
||||||
|
/*
|
||||||
|
* Pano vision fragment shader
|
||||||
|
*/
|
||||||
|
d->ubo_pano.hmd_warp_param[0] = c->xdev->distortion.pano.distortion_k[0];
|
||||||
|
d->ubo_pano.hmd_warp_param[1] = c->xdev->distortion.pano.distortion_k[1];
|
||||||
|
d->ubo_pano.hmd_warp_param[2] = c->xdev->distortion.pano.distortion_k[2];
|
||||||
|
d->ubo_pano.hmd_warp_param[3] = c->xdev->distortion.pano.distortion_k[3];
|
||||||
|
d->ubo_pano.aberr[0] = c->xdev->distortion.pano.aberration_k[0];
|
||||||
|
d->ubo_pano.aberr[1] = c->xdev->distortion.pano.aberration_k[1];
|
||||||
|
d->ubo_pano.aberr[2] = c->xdev->distortion.pano.aberration_k[2];
|
||||||
|
d->ubo_pano.aberr[3] = c->xdev->distortion.pano.aberration_k[3];
|
||||||
|
d->ubo_pano.lens_center[0][0] = c->xdev->views[0].lens_center.x_meters;
|
||||||
|
d->ubo_pano.lens_center[0][1] = c->xdev->views[0].lens_center.y_meters;
|
||||||
|
d->ubo_pano.lens_center[1][0] = c->xdev->views[1].lens_center.x_meters;
|
||||||
|
d->ubo_pano.lens_center[1][1] = c->xdev->views[1].lens_center.y_meters;
|
||||||
|
d->ubo_pano.viewport_scale[0] = c->xdev->views[0].display.w_meters;
|
||||||
|
d->ubo_pano.viewport_scale[1] = c->xdev->views[0].display.h_meters;
|
||||||
|
d->ubo_pano.warp_scale = c->xdev->distortion.pano.warp_scale;
|
||||||
|
|
||||||
|
memcpy(d->ubo_handle.mapped, &d->ubo_pano, sizeof(d->ubo_pano));
|
||||||
|
}
|
||||||
// clang-format on
|
// clang-format on
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Common vertex shader stuff.
|
* Common vertex shader stuff.
|
||||||
*/
|
*/
|
||||||
|
@ -683,9 +703,19 @@ comp_distortion_init_uniform_buffer(struct comp_distortion *d,
|
||||||
memory_property_flags |= VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
|
memory_property_flags |= VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
|
||||||
memory_property_flags |= VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;
|
memory_property_flags |= VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;
|
||||||
|
|
||||||
// Warp UBO in deferred fragment shader
|
// distortion ubo
|
||||||
|
VkDeviceSize ubo_size;
|
||||||
|
|
||||||
|
switch (d->distortion_model) {
|
||||||
|
case XRT_DISTORTION_MODEL_PANOTOOLS:
|
||||||
|
ubo_size = sizeof(d->ubo_pano);
|
||||||
|
break;
|
||||||
|
case XRT_DISTORTION_MODEL_VIVE: ubo_size = sizeof(d->ubo_vive); break;
|
||||||
|
default: ubo_size = sizeof(d->ubo_pano);
|
||||||
|
}
|
||||||
|
|
||||||
ret = _create_buffer(vk, usage_flags, memory_property_flags,
|
ret = _create_buffer(vk, usage_flags, memory_property_flags,
|
||||||
&d->ubo_handle, sizeof(d->ubo_pano), NULL);
|
&d->ubo_handle, ubo_size, NULL);
|
||||||
if (ret != VK_SUCCESS) {
|
if (ret != VK_SUCCESS) {
|
||||||
VK_DEBUG(vk, "Failed to create warp ubo buffer!");
|
VK_DEBUG(vk, "Failed to create warp ubo buffer!");
|
||||||
}
|
}
|
||||||
|
|
|
@ -56,6 +56,8 @@ struct comp_distortion
|
||||||
struct comp_uniform_buffer ubo_handle;
|
struct comp_uniform_buffer ubo_handle;
|
||||||
struct comp_uniform_buffer ubo_viewport_handles[2];
|
struct comp_uniform_buffer ubo_viewport_handles[2];
|
||||||
|
|
||||||
|
enum xrt_distortion_model distortion_model;
|
||||||
|
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
float hmd_warp_param[4];
|
float hmd_warp_param[4];
|
||||||
|
@ -65,6 +67,15 @@ struct comp_distortion
|
||||||
float warp_scale;
|
float warp_scale;
|
||||||
} ubo_pano;
|
} ubo_pano;
|
||||||
|
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
float coefficients[2][3][4];
|
||||||
|
float center[2][4];
|
||||||
|
float undistort_r2_cutoff[4];
|
||||||
|
float aspect_x_over_y;
|
||||||
|
float grow_for_undistort;
|
||||||
|
} ubo_vive;
|
||||||
|
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
struct xrt_matrix_2x2 rot;
|
struct xrt_matrix_2x2 rot;
|
||||||
|
|
|
@ -5,40 +5,17 @@
|
||||||
// Author: Lubosz Sarnecki <lubosz.sarnecki@collabora.com>
|
// Author: Lubosz Sarnecki <lubosz.sarnecki@collabora.com>
|
||||||
#version 450
|
#version 450
|
||||||
|
|
||||||
// TODO: Don't use hard coded config
|
|
||||||
float aspect_x_over_y = 0.8999999761581421;
|
|
||||||
float grow_for_undistort = 0.6000000238418579;
|
|
||||||
|
|
||||||
vec2 undistort_r2_cutoff = vec2(1.11622154712677, 1.101870775222778);
|
|
||||||
|
|
||||||
vec2 center[2] = vec2[](
|
|
||||||
vec2(0.08946027017045266, -0.009002181016260827),
|
|
||||||
vec2(-0.08933516629552526, -0.006014565287238661)
|
|
||||||
);
|
|
||||||
|
|
||||||
vec3 coeffs[2][3] = {
|
|
||||||
// left
|
|
||||||
{
|
|
||||||
// green
|
|
||||||
vec3(-0.188236068524731, -0.221086205321053, -0.2537849057915209),
|
|
||||||
// blue
|
|
||||||
vec3(-0.07316590815739493, -0.02332400789561968, 0.02469959434698275),
|
|
||||||
// red
|
|
||||||
vec3(-0.02223805567703767, -0.04931309279533211, -0.07862881939243466),
|
|
||||||
},
|
|
||||||
// right
|
|
||||||
{
|
|
||||||
// green
|
|
||||||
vec3(-0.1906209981894497, -0.2248896677207884, -0.2721364516782803),
|
|
||||||
// blue
|
|
||||||
vec3(-0.07346071902951497, -0.02189527566250131, 0.0581378652359256),
|
|
||||||
// red
|
|
||||||
vec3(-0.01755850332081247, -0.04517245633373419, -0.0928909347763)
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
layout (binding = 0) uniform sampler2D texSampler;
|
layout (binding = 0) uniform sampler2D texSampler;
|
||||||
|
|
||||||
|
layout (binding = 1, std140) uniform UBO
|
||||||
|
{
|
||||||
|
vec4 coeffs[2][3];
|
||||||
|
vec4 center[2];
|
||||||
|
vec4 undistort_r2_cutoff;
|
||||||
|
float aspect_x_over_y;
|
||||||
|
float grow_for_undistort;
|
||||||
|
} ubo;
|
||||||
|
|
||||||
layout (location = 0) in vec2 inUV;
|
layout (location = 0) in vec2 inUV;
|
||||||
layout (location = 1) flat in int inViewIndex;
|
layout (location = 1) flat in int inViewIndex;
|
||||||
|
|
||||||
|
@ -49,34 +26,34 @@ void main()
|
||||||
{
|
{
|
||||||
const int i = inViewIndex;
|
const int i = inViewIndex;
|
||||||
|
|
||||||
const vec2 factor = 0.5 / (1.0 + grow_for_undistort)
|
const vec2 factor = 0.5 / (1.0 + ubo.grow_for_undistort)
|
||||||
* vec2(1.0, aspect_x_over_y);
|
* vec2(1.0, ubo.aspect_x_over_y);
|
||||||
|
|
||||||
vec2 texCoord = 2.0 * inUV - vec2(1.0);
|
vec2 texCoord = 2.0 * inUV - vec2(1.0);
|
||||||
|
|
||||||
texCoord.y /= aspect_x_over_y;
|
texCoord.y /= ubo.aspect_x_over_y;
|
||||||
texCoord -= center[i];
|
texCoord -= ubo.center[i].xy;
|
||||||
|
|
||||||
float r2 = dot(texCoord, texCoord);
|
float r2 = dot(texCoord, texCoord);
|
||||||
|
|
||||||
vec3 d_inv = ((r2 * coeffs[i][2] + coeffs[i][1])
|
vec3 d_inv = ((r2 * ubo.coeffs[i][2].xyz + ubo.coeffs[i][1].xyz)
|
||||||
* r2 + coeffs[i][0])
|
* r2 + ubo.coeffs[i][0].xyz)
|
||||||
* r2 + vec3(1.0);
|
* r2 + vec3(1.0);
|
||||||
|
|
||||||
const vec3 d = 1.0 / d_inv;
|
const vec3 d = 1.0 / d_inv;
|
||||||
|
|
||||||
const vec2 offset = vec2(0.5);
|
const vec2 offset = vec2(0.5);
|
||||||
|
|
||||||
vec2 tcR = offset + (texCoord * d.r + center[i]) * factor;
|
vec2 tcR = offset + (texCoord * d.r + ubo.center[i].xy) * factor;
|
||||||
vec2 tcG = offset + (texCoord * d.g + center[i]) * factor;
|
vec2 tcG = offset + (texCoord * d.g + ubo.center[i].xy) * factor;
|
||||||
vec2 tcB = offset + (texCoord * d.b + center[i]) * factor;
|
vec2 tcB = offset + (texCoord * d.b + ubo.center[i].xy) * factor;
|
||||||
|
|
||||||
vec3 color = vec3(
|
vec3 color = vec3(
|
||||||
texture(texSampler, tcR).r,
|
texture(texSampler, tcR).r,
|
||||||
texture(texSampler, tcG).g,
|
texture(texSampler, tcG).g,
|
||||||
texture(texSampler, tcB).b);
|
texture(texSampler, tcB).b);
|
||||||
|
|
||||||
if (r2 > undistort_r2_cutoff[i]) {
|
if (r2 > ubo.undistort_r2_cutoff[i]) {
|
||||||
color *= 0.125;
|
color *= 0.125;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue