Beispiel #1
0
int rsys_destroy(struct rsys* rsys)
{
    if(rsys->magic != OCN_MAGIC)
        return OCN_FAIL;

    rsys_worker_req_quit(rsys);
    rsys_render_req_quit(rsys);

    //ocn_thread_join(&rsys->render_thread);
    //ocn_thread_join(&rsys->worker_thread);

    /* render requests */
    ocn_spin_destroy(&rsys->render_reqs_lock);
    rsys_req_t* req;
    while(queue_pull(&rsys->render_reqs, (void*)&req) != OCN_FAIL)
        ocn_free(req);

    /* worker requests */
    ocn_spin_destroy(&rsys->worker_reqs_lock);
    while(queue_pull(&rsys->render_reqs, (void*)&req) != OCN_FAIL)
        ocn_free(req);

    /* ro_assets */
    ocn_spin_destroy(&rsys->ro_assets_lock);
    for(uint64_t u = 0lu; u < OCN_MAX_ASSETS; u++)
        if(rsys->ro_assets[u].flags != 0lu)
            ro_asset_dest(&rsys->ro_assets[u].ro_asset);

    /* ro_entities */
    ocn_spin_destroy(&rsys->ro_entities_lock);
    for(uint64_t u = 0lu; u < OCN_MAX_ENTITIES; u++)
        if(rsys->ro_entities[u].flags != 0lu)
            ro_entity_dest(&rsys->ro_entities[u].ro_entity);

    rsys->magic = 0;

    return OCN_OK;
}
Beispiel #2
0
void* rsys_worker(void* ptr)
{
    struct rsys* rsys = ptr;

    int running = 1;
    int nsec = 0;
    while(running)
    {
        /* Pull one item from worker-request queue */

        /* after that check if there is at least one
           more item in it. If no, set msec to IDLE_TIME,
           else set msec to 0. */

        /* do what request want and push it to render_queue */

        /* wait */

        rsys_req_t* req = NULL;

        ocn_spin_lock(&rsys->worker_reqs_lock);
        queue_pull(&rsys->worker_reqs, (void*)&req);
        ocn_spin_unlock(&rsys->worker_reqs_lock);

        if(req != NULL)
        {
            switch(req->type)
            {
            case RSYS_REQ_TYPE_QUIT:
                running = 0;
                break;

            default:
                break;
            }

            ocn_free(req);
            nsec = 0;
        }
        else
        {
            nsec = RSYS_IDLE_TIME;
        }

        ocn_wait(nsec);
    }
}
Beispiel #3
0
int main(int argc, char *argv[]) {

	printf("Preparing vars to load...\n");
	void *var1 = (void*)malloc(sizeof(int));
	*((int*)var1) = 20;
	void *var2 = (void*)malloc(sizeof(int));
	*((int*)var2) = 44;
	void *var3 = (void*)malloc(sizeof(int));
	*((int*)var3) = 44;
	void *var4 = (void*)malloc(sizeof(int));
	*((int*)var4) = 44;
	void *var5 = (void*)malloc(sizeof(int));
	*((int*)var5) = 44;
	void *var6 = (void*)malloc(sizeof(int));
	*((int*)var6) = 44;
	void *var7 = (void*)malloc(sizeof(int));
	*((int*)var7) = 12;
	printf("Done.\n");
	
	/* List Test */
	printf("Beginning list test...\n");
	List *myList = (List*)malloc(sizeof(List));

	myList = create_list();
	list_push_front(myList, var1);
	list_push_front(myList, var2);
	list_push_front(myList, var3);
	list_push_front(myList, var4);
	list_push_front(myList, var5);
	list_push_front(myList, var6);
	list_push_front(myList, var7);

	for(int i = 0; i < 7; i++) {
		int *var = ((int*)list_pop_front(myList));
		printf("Var: %d\n", *var);
	}

	printf("List test done.\n");

	/* Vector Test */
	printf("Beginning vector test...\n");
	Vector *myVector;

	myVector = vector_create();
	vector_append(myVector, var1);
	vector_append(myVector, var2);
	vector_append(myVector, var3);
	vector_append(myVector, var4);
	vector_append(myVector, var5);
	vector_append(myVector, var6);
	vector_append(myVector, var7);

	for(int i = 0; i < 7; i++) {
		int *var = ((int*)vector_get(myVector, i));
		printf("Var: %d\n", *var);
	}

	printf("Vector test done.\n");

	/* Queue Test */
	printf("Beginning queue test...\n");
	Queue *myQueue = (Queue*)malloc(sizeof(Queue*));

	queue_init(myQueue, 10);
	queue_push(myQueue, var1);
	queue_push(myQueue, var2);
	queue_push(myQueue, var3);
	queue_push(myQueue, var4);
	queue_push(myQueue, var5);
	queue_push(myQueue, var6);
	queue_push(myQueue, var7);

	for(int i = 0; i < 7; i++) {
		int *var = ((int*)queue_pull(myQueue));
		printf("Var: %d\n", *var);
	}

	printf("Queue test done.\n");

	/* Stack Test */
	printf("Beginning stack test...\n");
	Stack *myStack = (Stack*)malloc(sizeof(Stack));
    Arr_Stack *myArrStack = (Arr_Stack*)malloc(sizeof(Arr_Stack));

    printf("Stack test done.\n");

	arr_stack_init(myArrStack, 10);

	arr_stack_push(myArrStack, var1);
	arr_stack_push(myArrStack, var2);
	arr_stack_push(myArrStack, var3);
	arr_stack_push(myArrStack, var4);
	arr_stack_push(myArrStack, var5);
	arr_stack_push(myArrStack, var6);
	arr_stack_push(myArrStack, var7);

	for(int i = 0; i < 7; i++) {
		int *var = ((int*)arr_stack_pull(myArrStack));
		printf("Var: %d\n", *var);
	}

	list_destroy(myList);
	vector_destroy(myVector);
	queue_destroy(myQueue);
	arr_stack_destroy(myArrStack);
	
	return 0;
}
Beispiel #4
0
void* rsys_render(void* ptr)
{
    /*
        I didn't want to use any locks in here, but
        it's impossible without. So ... one lock is
        needed for the queue, and one for the flags
        of the renderer.
    */

    struct rsys* rsys = ptr;

    /* make ctt1 the context for this thread */
    if(rsys->table.ctt1_make != NULL)
        rsys->table.ctt1_make();

    int running = 1;
    while(running)
	{
		frame_begin(&rsys->frame);

        /* ### FRAME BEGIN ### */

        glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_ACCUM_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);
        glClearColor(rsys->bg_red, rsys->bg_green, rsys->bg_blue, 1.0f); /* read from rsys instead of this */

        //glUseProgram(rsys->vsh);
        //glUseProgram(rsys->fsh);

        /* pull one request from queue per frame */

        rsys_req_t* req = NULL;

        ocn_spin_lock(&rsys->render_reqs_lock);
        queue_pull(&rsys->render_reqs, (void*)&req);
        ocn_spin_unlock(&rsys->render_reqs_lock);

        /*
            Requests with token equal to 0 are NOT! treated special.
            The request struct uses a flag field now ...
        */

        if(req != NULL)
        {
            if(FLAG_GET(req->flags, RSYS_REQ_RENDERER))
            {
                switch(req->type)
                {
                case RSYS_REQ_TYPE_QUIT:
                    running = 0;
                    break;

                case RSYS_REQ_TYPE_BG:
                    break;

                case RSYS_REQ_TYPE_ADD:
                    /* add to render list */
                    break;

                default:
                    break;
                }
            }
        }

        LIST_FOREACH_BEGIN(&rsys->ros)
        ro_entity_t* ro = LIST_ENTRY_DATA;

        if(req != NULL)
        {
            if(!FLAG_GET(req->flags, RSYS_REQ_RENDERER))
            {
                if(ro->token == req->token)
                {
                    switch(req->type)
                    {
                    case RSYS_REQ_TYPE_DEL:
                        break;
                    case RSYS_REQ_TYPE_MAP:
                        break;
                    case RSYS_REQ_TYPE_UNMAP:
                        break;
                    default:
                        break;
                    }
                }
            }
        }

        /* call render function */
/*
        switch(ro->type)
        {
        case RO_TYPE_STATIC_MESH:
            ro_static_mesh_render(&ro->static_mesh);
            break;

        default:
            break;
        }
*/
        LIST_FOREACH_END

        // bad idea... but for now we leave this like this
        // we could make a second queue for cleaning up requests
        free(req);

		if(rsys->table.win_swap != NULL)
            rsys->table.win_swap();

        /* call frame callback */

        //if(ocn.funcs.frame_callback != NULL)
        //    ocn.funcs.frame_callback(0);

        /* ### FRAME END ### */

        frame_wait(&rsys->frame);
        frame_end (&rsys->frame);
        frame_calc(&rsys->frame);
	}

	return NULL;
}