pvr: Setup common nop shader.
Signed-off-by: Rajnesh Kanwal <rajnesh.kanwal@imgtec.com> Reviewed-by: Frank Binns <frank.binns@imgtec.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16451>
This commit is contained in:
parent
c2aa3acf7e
commit
ad7f494a1c
|
@ -44,6 +44,7 @@
|
|||
#include "pvr_device_info.h"
|
||||
#include "pvr_job_render.h"
|
||||
#include "pvr_limits.h"
|
||||
#include "pvr_nop_usc.h"
|
||||
#include "pvr_pds.h"
|
||||
#include "pvr_private.h"
|
||||
#include "pvr_winsys.h"
|
||||
|
@ -925,7 +926,7 @@ vk_icdGetPhysicalDeviceProcAddr(VkInstance _instance, const char *pName)
|
|||
return vk_instance_get_physical_device_proc_addr(&instance->vk, pName);
|
||||
}
|
||||
|
||||
static VkResult pvr_device_init_compute_pds_program(struct pvr_device *device)
|
||||
static VkResult pvr_device_init_compute_fence_program(struct pvr_device *device)
|
||||
{
|
||||
const struct pvr_device_info *dev_info = &device->pdevice->dev_info;
|
||||
const uint32_t cache_line_size = rogue_get_slc_cache_line_size(dev_info);
|
||||
|
@ -1010,6 +1011,72 @@ static void pvr_device_get_pixel_event_pds_program_data_size(
|
|||
*data_size_in_dwords_out = program.data_size;
|
||||
}
|
||||
|
||||
static VkResult pvr_device_init_nop_program(struct pvr_device *device)
|
||||
{
|
||||
const uint32_t cache_line_size =
|
||||
rogue_get_slc_cache_line_size(&device->pdevice->dev_info);
|
||||
struct pvr_pds_kickusc_program program = { 0 };
|
||||
uint32_t staging_buffer_size;
|
||||
uint32_t *staging_buffer;
|
||||
VkResult result;
|
||||
|
||||
result = pvr_gpu_upload_usc(device,
|
||||
pvr_nop_usc_code,
|
||||
sizeof(pvr_nop_usc_code),
|
||||
cache_line_size,
|
||||
&device->nop_program.usc);
|
||||
if (result != VK_SUCCESS)
|
||||
return result;
|
||||
|
||||
/* Setup a PDS program that kicks the static USC program. */
|
||||
pvr_pds_setup_doutu(&program.usc_task_control,
|
||||
device->nop_program.usc->vma->dev_addr.addr,
|
||||
0U,
|
||||
PVRX(PDSINST_DOUTU_SAMPLE_RATE_INSTANCE),
|
||||
false);
|
||||
|
||||
pvr_pds_set_sizes_pixel_shader(&program);
|
||||
|
||||
staging_buffer_size =
|
||||
(program.code_size + program.data_size) * sizeof(*staging_buffer);
|
||||
|
||||
staging_buffer = vk_alloc(&device->vk.alloc,
|
||||
staging_buffer_size,
|
||||
8U,
|
||||
VK_SYSTEM_ALLOCATION_SCOPE_COMMAND);
|
||||
if (!staging_buffer) {
|
||||
result = vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
|
||||
goto err_free_nop_usc_bo;
|
||||
}
|
||||
|
||||
pvr_pds_generate_pixel_shader_program(&program, staging_buffer);
|
||||
|
||||
/* FIXME: Figure out the define for alignment of 16. */
|
||||
result = pvr_gpu_upload_pds(device,
|
||||
staging_buffer,
|
||||
program.data_size,
|
||||
16U,
|
||||
&staging_buffer[program.data_size],
|
||||
program.code_size,
|
||||
16U,
|
||||
16U,
|
||||
&device->nop_program.pds);
|
||||
if (result != VK_SUCCESS)
|
||||
goto err_free_staging_buffer;
|
||||
|
||||
vk_free(&device->vk.alloc, staging_buffer);
|
||||
|
||||
return VK_SUCCESS;
|
||||
|
||||
err_free_staging_buffer:
|
||||
vk_free(&device->vk.alloc, staging_buffer);
|
||||
|
||||
err_free_nop_usc_bo:
|
||||
pvr_bo_free(device, device->nop_program.usc);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
VkResult pvr_CreateDevice(VkPhysicalDevice physicalDevice,
|
||||
const VkDeviceCreateInfo *pCreateInfo,
|
||||
const VkAllocationCallbacks *pAllocator,
|
||||
|
@ -1084,13 +1151,17 @@ VkResult pvr_CreateDevice(VkPhysicalDevice physicalDevice,
|
|||
if (result != VK_SUCCESS)
|
||||
goto err_pvr_winsys_destroy;
|
||||
|
||||
result = pvr_queues_create(device, pCreateInfo);
|
||||
result = pvr_device_init_nop_program(device);
|
||||
if (result != VK_SUCCESS)
|
||||
goto err_pvr_free_list_destroy;
|
||||
|
||||
result = pvr_device_init_compute_pds_program(device);
|
||||
result = pvr_device_init_compute_fence_program(device);
|
||||
if (result != VK_SUCCESS)
|
||||
goto err_pvr_queues_destroy;
|
||||
goto err_pvr_free_nop_program;
|
||||
|
||||
result = pvr_queues_create(device, pCreateInfo);
|
||||
if (result != VK_SUCCESS)
|
||||
goto err_pvr_free_compute_fence;
|
||||
|
||||
if (pCreateInfo->pEnabledFeatures)
|
||||
memcpy(&device->features,
|
||||
|
@ -1111,8 +1182,12 @@ VkResult pvr_CreateDevice(VkPhysicalDevice physicalDevice,
|
|||
|
||||
return VK_SUCCESS;
|
||||
|
||||
err_pvr_queues_destroy:
|
||||
pvr_queues_destroy(device);
|
||||
err_pvr_free_compute_fence:
|
||||
pvr_bo_free(device, device->pds_compute_fence_program.pvr_bo);
|
||||
|
||||
err_pvr_free_nop_program:
|
||||
pvr_bo_free(device, device->nop_program.pds.pvr_bo);
|
||||
pvr_bo_free(device, device->nop_program.usc);
|
||||
|
||||
err_pvr_free_list_destroy:
|
||||
pvr_free_list_destroy(device->global_free_list);
|
||||
|
@ -1140,8 +1215,10 @@ void pvr_DestroyDevice(VkDevice _device,
|
|||
{
|
||||
PVR_FROM_HANDLE(pvr_device, device, _device);
|
||||
|
||||
pvr_bo_free(device, device->pds_compute_fence_program.pvr_bo);
|
||||
pvr_queues_destroy(device);
|
||||
pvr_bo_free(device, device->pds_compute_fence_program.pvr_bo);
|
||||
pvr_bo_free(device, device->nop_program.pds.pvr_bo);
|
||||
pvr_bo_free(device, device->nop_program.usc);
|
||||
pvr_free_list_destroy(device->global_free_list);
|
||||
pvr_winsys_destroy(device->ws);
|
||||
close(device->render_fd);
|
||||
|
|
|
@ -289,6 +289,11 @@ struct pvr_device {
|
|||
|
||||
struct pvr_pds_upload pds_compute_fence_program;
|
||||
|
||||
struct {
|
||||
struct pvr_pds_upload pds;
|
||||
struct pvr_bo *usc;
|
||||
} nop_program;
|
||||
|
||||
VkPhysicalDeviceFeatures features;
|
||||
};
|
||||
|
||||
|
|
|
@ -0,0 +1,35 @@
|
|||
/*
|
||||
* Copyright © 2022 Imagination Technologies Ltd.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the next
|
||||
* paragraph) shall be included in all copies or substantial portions of the
|
||||
* Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
/* Auto-generated file - don't edit */
|
||||
|
||||
#ifndef PVR_NOP_USC_H
|
||||
#define PVR_NOP_USC_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
static const uint8_t pvr_nop_usc_code[] = {
|
||||
0x04, 0x80, 0xEE, 0x00, 0xF2, 0xFF, 0xFF, 0xFF,
|
||||
};
|
||||
|
||||
#endif /* PVR_NOP_USC_H */
|
Loading…
Reference in New Issue