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
|
||||
{
|
||||
Genode::Env &env;
|
||||
gpgpu_virt::Connection backend_driver;
|
||||
Genode::Allocator_stupid allocator;
|
||||
|
||||
const unsigned long size = 0x40000000;
|
||||
cl_genode clg;
|
||||
Genode::Ram_dataspace_capability vgpu_mem_ram_cap;
|
||||
Genode::Ram_dataspace_capability vgpu_shm_ram_cap;
|
||||
|
||||
volatile uint8_t *ready;
|
||||
const unsigned long img_size = 320 * 240 * sizeof(float);
|
||||
@@ -42,28 +37,13 @@ struct consumer_conv
|
||||
Genode::log("===Init Consumer Surf===");
|
||||
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
|
||||
const unsigned long id = 0;
|
||||
Genode::size_t total_size = 0;
|
||||
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);
|
||||
clg.get_shm(id);
|
||||
|
||||
// alloc whole data
|
||||
ready = (uint8_t *)allocator.alloc(1);
|
||||
data = (float *)allocator.alloc_aligned(0x10000, img_size);
|
||||
ready = (uint8_t *)clg.shm_alloc(id, 1);
|
||||
data = (float *)clg.shm_aligned_alloc(id, 0x10000, img_size);
|
||||
}
|
||||
|
||||
void run()
|
||||
@@ -86,7 +66,7 @@ struct consumer_conv
|
||||
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
|
||||
{
|
||||
Genode::Env &env;
|
||||
gpgpu_virt::Connection backend_driver;
|
||||
Genode::Allocator_stupid allocator;
|
||||
|
||||
const unsigned long size = 0x40000000;
|
||||
cl_genode clg;
|
||||
Genode::Ram_dataspace_capability vgpu_mem_ram_cap;
|
||||
Genode::Ram_dataspace_capability vgpu_shm_ram_cap;
|
||||
|
||||
volatile uint8_t *ready;
|
||||
const unsigned long img_size = 320 * 240 * sizeof(float);
|
||||
@@ -42,28 +37,13 @@ struct consumer_conv
|
||||
Genode::log("===Init Consumer Conv===");
|
||||
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
|
||||
const unsigned long id = 0;
|
||||
Genode::size_t total_size = 0;
|
||||
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);
|
||||
clg.get_shm(id);
|
||||
|
||||
// alloc whole data
|
||||
ready = (uint8_t *)allocator.alloc(1);
|
||||
data = (float *)allocator.alloc_aligned(0x10000, img_size);
|
||||
ready = (uint8_t *)clg.shm_alloc(id, 1);
|
||||
data = (float *)clg.shm_aligned_alloc(id, 0x10000, img_size);
|
||||
}
|
||||
|
||||
void run()
|
||||
@@ -86,7 +66,7 @@ struct consumer_conv
|
||||
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"
|
||||
|
||||
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
|
||||
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)
|
||||
{
|
||||
return allocator.alloc_aligned(alignment, size);
|
||||
@@ -33,6 +51,21 @@ void cl_genode::free(void* 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)
|
||||
{
|
||||
// convert virt vm addr to offset
|
||||
@@ -56,8 +89,3 @@ void cl_genode::wait(struct kernel_config* kconf)
|
||||
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
|
||||
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];
|
||||
|
||||
// do not allow copies
|
||||
@@ -108,12 +109,38 @@ public:
|
||||
void reset() { allocator.reset(); }
|
||||
|
||||
/**
|
||||
* @brief
|
||||
* @brief Get the shm object
|
||||
*
|
||||
* @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
|
||||
|
||||
Reference in New Issue
Block a user