• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1//
2// Copyright (C) 2009-2021 Intel Corporation
3//
4// SPDX-License-Identifier: MIT
5//
6//
7
8#include "api_interface.h"
9
10__attribute__((reqd_work_group_size(1, 1, 1))) void kernel CopyGeom(
11    global struct Geo *src,
12    global struct Geo *dst,
13    global float4 *vec,
14    global ushort *indices,
15    dword step)
16{
17    src = src + get_group_id(0);
18    dst = dst + get_group_id(0);
19    dst->Flags = src->Flags;
20    dst->Type = src->Type;
21    if (src->Type == GEOMETRY_TYPE_PROCEDURAL)
22    {
23        dst->Desc.Procedural.AABBByteStride = src->Desc.Procedural.AABBByteStride;
24        dst->Desc.Procedural.AABBCount = src->Desc.Procedural.AABBCount;
25        dst->Desc.Procedural.AABBByteStride = src->Desc.Procedural.AABBByteStride;
26    }
27    else
28    {
29        dst->Desc.Triangles.pTransformBuffer = src->Desc.Triangles.pTransformBuffer;
30        if (step == 0)
31            return;
32        dst->Desc.Triangles.IndexCount = src->Desc.Triangles.IndexCount;
33        if (step == 1)
34            return;
35        dst->Desc.Triangles.VertexCount = src->Desc.Triangles.VertexCount;
36        if (step == 2)
37            return;
38        dst->Desc.Triangles.IndexFormat = src->Desc.Triangles.IndexFormat;
39        if (step == 3)
40            return;
41        dst->Desc.Triangles.pIndexBuffer = src->Desc.Triangles.pIndexBuffer;
42        if (step == 4)
43            return;
44        dst->Desc.Triangles.pVertexBuffer = src->Desc.Triangles.pVertexBuffer;
45        if (step == 5)
46            return;
47        dst->Desc.Triangles.VertexBufferByteStride = src->Desc.Triangles.VertexBufferByteStride;
48
49        dst->Desc.Triangles.VertexFormat = src->Desc.Triangles.VertexFormat;
50
51        for (uint t = 0; t * 3 < dst->Desc.Triangles.IndexCount; t++)
52        {
53            uint3 tri = GRL_load_triangle(src, t);
54            vec[t * 3] = GRL_load_vertex(src, tri[0]);
55            vec[t * 3 + 1] = GRL_load_vertex(src, tri[1]);
56            vec[t * 3 + 2] = GRL_load_vertex(src, tri[2]);
57        }
58    }
59}
60