diff --git a/src/broadcom/vulkan/v3dv_device.c b/src/broadcom/vulkan/v3dv_device.c index 800b89eb103..aa4e75310b0 100644 --- a/src/broadcom/vulkan/v3dv_device.c +++ b/src/broadcom/vulkan/v3dv_device.c @@ -2086,6 +2086,7 @@ v3dv_CreateSampler(VkDevice _device, return vk_error(device->instance, VK_ERROR_OUT_OF_HOST_MEMORY); sampler->compare_enable = pCreateInfo->compareEnable; + sampler->unnormalized_coordinates = pCreateInfo->unnormalizedCoordinates; pack_sampler_state(sampler, pCreateInfo); *pSampler = v3dv_sampler_to_handle(sampler); diff --git a/src/broadcom/vulkan/v3dv_private.h b/src/broadcom/vulkan/v3dv_private.h index bc48c81c2b4..f53b7a6f4a8 100644 --- a/src/broadcom/vulkan/v3dv_private.h +++ b/src/broadcom/vulkan/v3dv_private.h @@ -1375,6 +1375,7 @@ struct v3dv_descriptor_map { struct v3dv_sampler { bool compare_enable; + bool unnormalized_coordinates; /* Prepacked SAMPLER_STATE, that is referenced as part of the tmu * configuration. If needed it will be copied to the descriptor info during diff --git a/src/broadcom/vulkan/v3dv_uniforms.c b/src/broadcom/vulkan/v3dv_uniforms.c index f1117fcb87d..a3ad5c2d13b 100644 --- a/src/broadcom/vulkan/v3dv_uniforms.c +++ b/src/broadcom/vulkan/v3dv_uniforms.c @@ -140,10 +140,25 @@ write_tmu_p1(struct v3dv_cmd_buffer *cmd_buffer, v3dv_descriptor_map_get_sampler_state(descriptor_state, &pipeline->sampler_map, pipeline->layout, sampler_idx); + const struct v3dv_sampler *sampler = + v3dv_descriptor_map_get_sampler(descriptor_state, &pipeline->sampler_map, + pipeline->layout, sampler_idx); + assert(sampler); + + /* Set unnormalized coordinates flag from sampler object */ + uint32_t p1_packed = v3d_unit_data_get_offset(data); + if (sampler->unnormalized_coordinates) { + struct V3DX(TMU_CONFIG_PARAMETER_1) p1_unpacked; + V3DX(TMU_CONFIG_PARAMETER_1_unpack)((uint8_t *)&p1_packed, &p1_unpacked); + p1_unpacked.unnormalized_coordinates = true; + V3DX(TMU_CONFIG_PARAMETER_1_pack)(NULL, (uint8_t *)&p1_packed, + &p1_unpacked); + } + cl_aligned_reloc(&job->indirect, uniforms, sampler_state_reloc.bo, sampler_state_reloc.offset + - v3d_unit_data_get_offset(data)); + p1_packed); } static void