mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-08 15:38:09 +02:00
nvk: Expose a bind_vertex_buffer helper
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24326>
This commit is contained in:
parent
b0d007e7de
commit
4746099306
2 changed files with 34 additions and 20 deletions
|
|
@ -72,6 +72,11 @@ struct nvk_rendering_state {
|
|||
struct nvk_attachment stencil_att;
|
||||
};
|
||||
|
||||
struct nvk_addr_range {
|
||||
uint64_t addr;
|
||||
uint64_t range;
|
||||
};
|
||||
|
||||
struct nvk_graphics_state {
|
||||
struct nvk_rendering_state render;
|
||||
struct nvk_graphics_pipeline *pipeline;
|
||||
|
|
@ -136,6 +141,9 @@ void nvk_cmd_bind_graphics_pipeline(struct nvk_cmd_buffer *cmd,
|
|||
void nvk_cmd_bind_compute_pipeline(struct nvk_cmd_buffer *cmd,
|
||||
struct nvk_compute_pipeline *pipeline);
|
||||
|
||||
void nvk_cmd_bind_vertex_buffer(struct nvk_cmd_buffer *cmd, uint32_t vb_idx,
|
||||
struct nvk_addr_range addr_range);
|
||||
|
||||
static inline struct nvk_descriptor_state *
|
||||
nvk_get_descriptors_state(struct nvk_cmd_buffer *cmd,
|
||||
VkPipelineBindPoint bind_point)
|
||||
|
|
|
|||
|
|
@ -1237,6 +1237,28 @@ nvk_CmdBindIndexBuffer(VkCommandBuffer commandBuffer,
|
|||
P_IMMD(p, NV9097, SET_INDEX_BUFFER_E, vk_to_nv_index_format(indexType));
|
||||
}
|
||||
|
||||
void
|
||||
nvk_cmd_bind_vertex_buffer(struct nvk_cmd_buffer *cmd, uint32_t vb_idx,
|
||||
struct nvk_addr_range addr_range)
|
||||
{
|
||||
struct nouveau_ws_push *p = cmd->push;
|
||||
|
||||
P_MTHD(p, NV9097, SET_VERTEX_STREAM_A_LOCATION_A(vb_idx));
|
||||
P_NV9097_SET_VERTEX_STREAM_A_LOCATION_A(p, vb_idx, addr_range.addr >> 32);
|
||||
P_NV9097_SET_VERTEX_STREAM_A_LOCATION_B(p, vb_idx, addr_range.addr);
|
||||
|
||||
if (nvk_cmd_buffer_3d_cls(cmd) >= TURING_A) {
|
||||
P_MTHD(p, NVC597, SET_VERTEX_STREAM_SIZE_A(vb_idx));
|
||||
P_NVC597_SET_VERTEX_STREAM_SIZE_A(p, vb_idx, addr_range.range >> 32);
|
||||
P_NVC597_SET_VERTEX_STREAM_SIZE_B(p, vb_idx, addr_range.range);
|
||||
} else {
|
||||
uint64_t limit = addr_range.addr + addr_range.range - 1;
|
||||
P_MTHD(p, NV9097, SET_VERTEX_STREAM_LIMIT_A_A(vb_idx));
|
||||
P_NV9097_SET_VERTEX_STREAM_LIMIT_A_A(p, vb_idx, limit >> 32);
|
||||
P_NV9097_SET_VERTEX_STREAM_LIMIT_A_B(p, vb_idx, limit);
|
||||
}
|
||||
}
|
||||
|
||||
VKAPI_ATTR void VKAPI_CALL
|
||||
nvk_CmdBindVertexBuffers2(VkCommandBuffer commandBuffer,
|
||||
uint32_t firstBinding,
|
||||
|
|
@ -1247,7 +1269,6 @@ nvk_CmdBindVertexBuffers2(VkCommandBuffer commandBuffer,
|
|||
const VkDeviceSize *pStrides)
|
||||
{
|
||||
VK_FROM_HANDLE(nvk_cmd_buffer, cmd, commandBuffer);
|
||||
struct nouveau_ws_push *p = cmd->push;
|
||||
|
||||
if (pStrides) {
|
||||
vk_cmd_set_vertex_binding_strides(&cmd->vk, firstBinding,
|
||||
|
|
@ -1259,28 +1280,13 @@ nvk_CmdBindVertexBuffers2(VkCommandBuffer commandBuffer,
|
|||
uint32_t idx = firstBinding + i;
|
||||
|
||||
uint64_t size = pSizes ? pSizes[i] : VK_WHOLE_SIZE;
|
||||
uint64_t addr, range;
|
||||
struct nvk_addr_range addr_range = { };
|
||||
if (buffer) {
|
||||
addr = nvk_buffer_address(buffer, pOffsets[i]);
|
||||
range = vk_buffer_range(&buffer->vk, pOffsets[i], size);
|
||||
} else {
|
||||
range = addr = 0;
|
||||
addr_range.addr = nvk_buffer_address(buffer, pOffsets[i]);
|
||||
addr_range.range = vk_buffer_range(&buffer->vk, pOffsets[i], size);
|
||||
}
|
||||
|
||||
P_MTHD(p, NV9097, SET_VERTEX_STREAM_A_LOCATION_A(idx));
|
||||
P_NV9097_SET_VERTEX_STREAM_A_LOCATION_A(p, idx, addr >> 32);
|
||||
P_NV9097_SET_VERTEX_STREAM_A_LOCATION_B(p, idx, addr);
|
||||
|
||||
if (nvk_cmd_buffer_3d_cls(cmd) >= TURING_A) {
|
||||
P_MTHD(p, NVC597, SET_VERTEX_STREAM_SIZE_A(idx));
|
||||
P_NVC597_SET_VERTEX_STREAM_SIZE_A(p, idx, range >> 32);
|
||||
P_NVC597_SET_VERTEX_STREAM_SIZE_B(p, idx, range);
|
||||
} else {
|
||||
uint64_t limit = addr + range - 1;
|
||||
P_MTHD(p, NV9097, SET_VERTEX_STREAM_LIMIT_A_A(idx));
|
||||
P_NV9097_SET_VERTEX_STREAM_LIMIT_A_A(p, idx, limit >> 32);
|
||||
P_NV9097_SET_VERTEX_STREAM_LIMIT_A_B(p, idx, limit);
|
||||
}
|
||||
nvk_cmd_bind_vertex_buffer(cmd, idx, addr_range);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue