I looked at Zink code a bit and it seems possible to replace softpipe driver of existing Haiku Gallium add-on with Zink driver. It use memcpy()
to draw surface:
static void
zink_flush_frontbuffer(struct pipe_screen *pscreen,
struct pipe_context *pcontext,
struct pipe_resource *pres,
unsigned level, unsigned layer,
void *winsys_drawable_handle,
struct pipe_box *sub_box)
{
struct zink_screen *screen = zink_screen(pscreen);
struct sw_winsys *winsys = screen->winsys;
struct zink_resource *res = zink_resource(pres);
if (!winsys)
return;
void *map = winsys->displaytarget_map(winsys, res->dt, 0);
if (map) {
VkImageSubresource isr = {};
isr.aspectMask = res->aspect;
isr.mipLevel = level;
isr.arrayLayer = layer;
VkSubresourceLayout layout;
vkGetImageSubresourceLayout(screen->dev, res->image, &isr, &layout);
void *ptr;
VkResult result = vkMapMemory(screen->dev, res->mem, res->offset, res->size, 0, &ptr);
if (result != VK_SUCCESS) {
debug_printf("failed to map memory for display\n");
return;
}
for (int i = 0; i < pres->height0; ++i) {
uint8_t *src = (uint8_t *)ptr + i * layout.rowPitch;
uint8_t *dst = (uint8_t *)map + i * res->dt_stride;
memcpy(dst, src, res->dt_stride);
}
vkUnmapMemory(screen->dev, res->mem);
}
winsys->displaytarget_unmap(winsys, res->dt);
assert(res->dt);
if (res->dt)
winsys->displaytarget_display(winsys, res->dt, winsys_drawable_handle, sub_box);
}
from Hacker News https://ift.tt/3d2rEbx
No comments:
Post a Comment
Note: Only a member of this blog may post a comment.