mirror of
https://github.com/mmueller41/genode.git
synced 2026-01-21 12:32:56 +01:00
fixed vgpu duplication
This commit is contained in:
@@ -25,13 +25,8 @@ namespace ns_OpenSurf{int main(int argc, char *argv[]);};
|
|||||||
struct consumer_conv
|
struct consumer_conv
|
||||||
{
|
{
|
||||||
Genode::Env &env;
|
Genode::Env &env;
|
||||||
gpgpu_virt::Connection backend_driver;
|
|
||||||
Genode::Allocator_stupid allocator;
|
|
||||||
|
|
||||||
const unsigned long size = 0x40000000;
|
const unsigned long size = 0x40000000;
|
||||||
cl_genode clg;
|
cl_genode clg;
|
||||||
Genode::Ram_dataspace_capability vgpu_mem_ram_cap;
|
|
||||||
Genode::Ram_dataspace_capability vgpu_shm_ram_cap;
|
|
||||||
|
|
||||||
volatile uint8_t *ready;
|
volatile uint8_t *ready;
|
||||||
const unsigned long img_size = 320 * 240 * sizeof(float);
|
const unsigned long img_size = 320 * 240 * sizeof(float);
|
||||||
@@ -42,28 +37,13 @@ struct consumer_conv
|
|||||||
Genode::log("===Init Consumer Surf===");
|
Genode::log("===Init Consumer Surf===");
|
||||||
clInitGenode(clg);
|
clInitGenode(clg);
|
||||||
|
|
||||||
// register vgpu (optional?)
|
|
||||||
const unsigned long size_vgpu_mem = 0x1000;
|
|
||||||
backend_driver.register_vm(size_vgpu_mem, vgpu_mem_ram_cap);
|
|
||||||
|
|
||||||
// create shm for gpu
|
// create shm for gpu
|
||||||
const unsigned long id = 0;
|
const unsigned long id = 0;
|
||||||
Genode::size_t total_size = 0;
|
clg.get_shm(id);
|
||||||
while (total_size == 0)
|
|
||||||
{
|
|
||||||
backend_driver.ask_shm(id, total_size, vgpu_shm_ram_cap);
|
|
||||||
}
|
|
||||||
|
|
||||||
// attach shm to vm
|
|
||||||
Genode::addr_t mapped_base = env.rm().attach(vgpu_shm_ram_cap);
|
|
||||||
clg.add_shm_mapped_base(id, mapped_base);
|
|
||||||
|
|
||||||
// use it in allocator
|
|
||||||
allocator.add_range(mapped_base, total_size);
|
|
||||||
|
|
||||||
// alloc whole data
|
// alloc whole data
|
||||||
ready = (uint8_t *)allocator.alloc(1);
|
ready = (uint8_t *)clg.shm_alloc(id, 1);
|
||||||
data = (float *)allocator.alloc_aligned(0x10000, img_size);
|
data = (float *)clg.shm_aligned_alloc(id, 0x10000, img_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
void run()
|
void run()
|
||||||
@@ -86,7 +66,7 @@ struct consumer_conv
|
|||||||
Genode::log("Consumer Surf completed");
|
Genode::log("Consumer Surf completed");
|
||||||
}
|
}
|
||||||
|
|
||||||
consumer_conv(Genode::Env &e) : env(e), backend_driver(env), allocator(), clg(env, size), ready(nullptr), data(nullptr)
|
consumer_conv(Genode::Env &e) : env(e), clg(env, size), ready(nullptr), data(nullptr)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -25,13 +25,8 @@ namespace ns_convolution_2d{int main(int argc, char *argv[]);};
|
|||||||
struct consumer_conv
|
struct consumer_conv
|
||||||
{
|
{
|
||||||
Genode::Env &env;
|
Genode::Env &env;
|
||||||
gpgpu_virt::Connection backend_driver;
|
|
||||||
Genode::Allocator_stupid allocator;
|
|
||||||
|
|
||||||
const unsigned long size = 0x40000000;
|
const unsigned long size = 0x40000000;
|
||||||
cl_genode clg;
|
cl_genode clg;
|
||||||
Genode::Ram_dataspace_capability vgpu_mem_ram_cap;
|
|
||||||
Genode::Ram_dataspace_capability vgpu_shm_ram_cap;
|
|
||||||
|
|
||||||
volatile uint8_t *ready;
|
volatile uint8_t *ready;
|
||||||
const unsigned long img_size = 320 * 240 * sizeof(float);
|
const unsigned long img_size = 320 * 240 * sizeof(float);
|
||||||
@@ -42,28 +37,13 @@ struct consumer_conv
|
|||||||
Genode::log("===Init Consumer Conv===");
|
Genode::log("===Init Consumer Conv===");
|
||||||
clInitGenode(clg);
|
clInitGenode(clg);
|
||||||
|
|
||||||
// register vgpu (optional?)
|
|
||||||
const unsigned long size_vgpu_mem = 0x1000;
|
|
||||||
backend_driver.register_vm(size_vgpu_mem, vgpu_mem_ram_cap);
|
|
||||||
|
|
||||||
// create shm for gpu
|
// create shm for gpu
|
||||||
const unsigned long id = 0;
|
const unsigned long id = 0;
|
||||||
Genode::size_t total_size = 0;
|
clg.get_shm(id);
|
||||||
while (total_size == 0)
|
|
||||||
{
|
|
||||||
backend_driver.ask_shm(id, total_size, vgpu_shm_ram_cap);
|
|
||||||
}
|
|
||||||
|
|
||||||
// attach shm to vm
|
|
||||||
Genode::addr_t mapped_base = env.rm().attach(vgpu_shm_ram_cap);
|
|
||||||
clg.add_shm_mapped_base(id, mapped_base);
|
|
||||||
|
|
||||||
// use it in allocator
|
|
||||||
allocator.add_range(mapped_base, total_size);
|
|
||||||
|
|
||||||
// alloc whole data
|
// alloc whole data
|
||||||
ready = (uint8_t *)allocator.alloc(1);
|
ready = (uint8_t *)clg.shm_alloc(id, 1);
|
||||||
data = (float *)allocator.alloc_aligned(0x10000, img_size);
|
data = (float *)clg.shm_aligned_alloc(id, 0x10000, img_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
void run()
|
void run()
|
||||||
@@ -86,7 +66,7 @@ struct consumer_conv
|
|||||||
Genode::log("Consumer Conv completed");
|
Genode::log("Consumer Conv completed");
|
||||||
}
|
}
|
||||||
|
|
||||||
consumer_conv(Genode::Env &e) : env(e), backend_driver(env), allocator(), clg(env, size), ready(nullptr), data(nullptr)
|
consumer_conv(Genode::Env &e) : env(e), clg(env, size), ready(nullptr), data(nullptr)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#include "cl_genode.h"
|
#include "cl_genode.h"
|
||||||
|
|
||||||
cl_genode::cl_genode(Genode::Env& env, unsigned long size) : env(env), allocator(), mapped_base(0), backend_driver(env), shm_mapped_base{0, }
|
cl_genode::cl_genode(Genode::Env& env, unsigned long size) : env(env), allocator(), mapped_base(0), backend_driver(env), shm_allocator(), shm_mapped_base{0, }
|
||||||
{
|
{
|
||||||
// get shared memory with driver
|
// get shared memory with driver
|
||||||
Genode::Ram_dataspace_capability ram_cap;
|
Genode::Ram_dataspace_capability ram_cap;
|
||||||
@@ -18,6 +18,24 @@ cl_genode::~cl_genode()
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void cl_genode::get_shm(int shmid)
|
||||||
|
{
|
||||||
|
// create shm for gpu
|
||||||
|
Genode::size_t total_size = 0;
|
||||||
|
Genode::Ram_dataspace_capability ram_cap;
|
||||||
|
while (total_size == 0)
|
||||||
|
{
|
||||||
|
backend_driver.ask_shm(shmid, total_size, ram_cap);
|
||||||
|
}
|
||||||
|
|
||||||
|
// attach shm to vm
|
||||||
|
shm_mapped_base[shmid] = env.rm().attach(ram_cap);
|
||||||
|
|
||||||
|
// use it in allocator
|
||||||
|
shm_allocator[shmid].add_range(shm_mapped_base[shmid], total_size);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
void* cl_genode::aligned_alloc(Genode::uint32_t alignment, Genode::uint32_t size)
|
void* cl_genode::aligned_alloc(Genode::uint32_t alignment, Genode::uint32_t size)
|
||||||
{
|
{
|
||||||
return allocator.alloc_aligned(alignment, size);
|
return allocator.alloc_aligned(alignment, size);
|
||||||
@@ -33,6 +51,21 @@ void cl_genode::free(void* addr)
|
|||||||
allocator.free(addr);
|
allocator.free(addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void* cl_genode::shm_aligned_alloc(int shmid, Genode::uint32_t alignment, Genode::uint32_t size)
|
||||||
|
{
|
||||||
|
return shm_allocator[shmid].alloc_aligned(alignment, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
void* cl_genode::shm_alloc(int shmid, Genode::uint32_t size)
|
||||||
|
{
|
||||||
|
return shm_allocator[shmid].alloc(size);
|
||||||
|
}
|
||||||
|
|
||||||
|
void cl_genode::shm_free(int shmid, void* addr)
|
||||||
|
{
|
||||||
|
shm_allocator[shmid].free(addr);
|
||||||
|
}
|
||||||
|
|
||||||
void cl_genode::enqueue_task(struct kernel_config* kconf)
|
void cl_genode::enqueue_task(struct kernel_config* kconf)
|
||||||
{
|
{
|
||||||
// convert virt vm addr to offset
|
// convert virt vm addr to offset
|
||||||
@@ -56,8 +89,3 @@ void cl_genode::wait(struct kernel_config* kconf)
|
|||||||
asm("nop");
|
asm("nop");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void cl_genode::add_shm_mapped_base(int shmid, Genode::addr_t mbase)
|
|
||||||
{
|
|
||||||
shm_mapped_base[shmid] = mbase;
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -33,7 +33,8 @@ private:
|
|||||||
// rpc
|
// rpc
|
||||||
gpgpu_virt::Connection backend_driver;
|
gpgpu_virt::Connection backend_driver;
|
||||||
|
|
||||||
// shm mapped_bases
|
// shm
|
||||||
|
Genode::Allocator_stupid shm_allocator[MAX_SHM_REGIONS];
|
||||||
Genode::addr_t shm_mapped_base[MAX_SHM_REGIONS];
|
Genode::addr_t shm_mapped_base[MAX_SHM_REGIONS];
|
||||||
|
|
||||||
// do not allow copies
|
// do not allow copies
|
||||||
@@ -108,12 +109,38 @@ public:
|
|||||||
void reset() { allocator.reset(); }
|
void reset() { allocator.reset(); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief
|
* @brief Get the shm object
|
||||||
*
|
*
|
||||||
* @param shmid
|
* @param shmid
|
||||||
* @param mbase
|
|
||||||
*/
|
*/
|
||||||
void add_shm_mapped_base(int shmid, Genode::addr_t mbase);
|
void get_shm(int shmid);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief allocate aligned memory
|
||||||
|
*
|
||||||
|
* @param shmid the shared memory id
|
||||||
|
* @param alignment the alignment
|
||||||
|
* @param size the size in bytes
|
||||||
|
* @return void* the address of the allocated memory
|
||||||
|
*/
|
||||||
|
void* shm_aligned_alloc(int shmid, Genode::uint32_t alignment, Genode::uint32_t size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief
|
||||||
|
*
|
||||||
|
* @param shmid the shared memory id
|
||||||
|
* @param size
|
||||||
|
* @return void*
|
||||||
|
*/
|
||||||
|
void* shm_alloc(int shmid, Genode::uint32_t size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief free memory
|
||||||
|
*
|
||||||
|
* @param shmid the shared memory id
|
||||||
|
* @param addr the address of the memory to be freed
|
||||||
|
*/
|
||||||
|
void shm_free(int shmid, void* addr);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // CL_GENODE_H
|
#endif // CL_GENODE_H
|
||||||
|
|||||||
Reference in New Issue
Block a user