Beispiel #1
0
void op3d::Engine::initVulkan()
{
    instance.create();
    callback.setup(instance);
    surface.create(instance, window);
    physicalDevice.create(instance, surface);
    device.create(physicalDevice, surface, graphicsQueue, presentQueue);
    swapChain.create(device, surface, physicalDevice, window);
    swapChain.createImageViews(device, swapChainImageViews);
    createRenderPass();
    createDescriptorSetLayout();
    createGraphicsPipeline();
    commandBufferManager.createCommandPool(physicalDevice, surface);
    createDepthResources();
    createFramebuffers();
    createTextureImage();
    createTextureImageView();
    createTextureSampler();
    createVertexBuffer();
    createIndexBuffer();
    createUniformBuffer();
    descriptorPool.createPool();
    descriptorSet.createSet(uniformBuffer, textureImageView, textureSampler, descriptorSetLayout, descriptorPool, device);
    createCommandBuffers();
    createSemaphores();
}
Beispiel #2
0
status_t
device_open(const char *name, uint32 flags, void **cookie)
{
	struct sis_info *info;
	area_id area;
	int id;

	// verify device access (we only allow one user at a time)
	{
		char *thisName;
		int32 mask;

		// search for device name
		for (id = 0; (thisName = gDeviceNames[id]) != NULL; id++) {
			if (!strcmp(name, thisName))
				break;
		}
		if (!thisName)
			return EINVAL;
	
		// check if device is already open
		mask = 1L << id;
		if (atomic_or(&gDeviceOpenMask, mask) & mask)
			return B_BUSY;
	}

	// allocate internal device structure
	if ((area = create_area(DEVICE_NAME " private data", cookie,
							B_ANY_KERNEL_ADDRESS,
							ROUND_TO_PAGE_SIZE(sizeof(struct sis_info)),
							B_FULL_LOCK, B_READ_AREA | B_WRITE_AREA)) < B_OK) {
		gDeviceOpenMask &= ~(1L << id);
		return B_NO_MEMORY;
	}
	info = (struct sis_info *)*cookie;
	memset(info, 0, sizeof(struct sis_info));

	info->cookieMagic = SiS_COOKIE_MAGIC;
	info->thisArea = area;
	info->id = id;
	info->pciInfo = pciInfo[id];
	info->registers = (addr_t)pciInfo[id]->u.h0.base_registers[0];

	if (sis900_getMACAddress(info))
		dprintf(DEVICE_NAME ": MAC address %02x:%02x:%02x:%02x:%02x:%02x\n",
			  info->address.ebyte[0], info->address.ebyte[1], info->address.ebyte[2],
			  info->address.ebyte[3], info->address.ebyte[4], info->address.ebyte[5]);
	else
		dprintf(DEVICE_NAME ": could not get MAC address\n");

	readSettings(info);

	if (createSemaphores(info) == B_OK) {
		status_t status = sis900_initPHYs(info);
		if (status == B_OK) {
			TRACE((DEVICE_NAME ": MII status = %d\n", mdio_read(info, MII_STATUS)));

			//sis900_configFIFOs(info);
			sis900_reset(info);

			// install & enable interrupts
			install_io_interrupt_handler(info->pciInfo->u.h0.interrupt_line,
				sis900_interrupt, info, 0);
			sis900_enableInterrupts(info);

			sis900_setRxFilter(info);
			sis900_createRings(info);

			// enable receiver's state machine
			write32(info->registers + SiS900_MAC_COMMAND, SiS900_MAC_CMD_Rx_ENABLE);

			// check link mode & add timer (once every second)
			sis900_checkMode(info);
			add_timer(&info->timer, sis900_timer, 1000000LL, B_PERIODIC_TIMER);	

			return B_OK;
		}
		dprintf(DEVICE_NAME ": could not initialize MII PHY: %s\n", strerror(status));
		deleteSemaphores(info);
	} else
		dprintf(DEVICE_NAME ": could not create semaphores.\n");

	gDeviceOpenMask &= ~(1L << id);
	delete_area(area);

	return B_ERROR;
}
int main(void) {
	// create shared memory buffer with rw perms
	int shmid = shmget(1000, 1, IPC_CREAT | PERMS);
	if(shmid < 0) {
		fprintf(stderr, "Unable to create shared buffer.\n");
		exit(EXIT_FAILURE);
	}

	// allocate buffer
	if((buffer = (int*)shmat(shmid, (char*)0, 0)) == (int*)-1) {
		fprintf(stderr, "Unable to allocate.\n");
		exit(EXIT_FAILURE);
	}

	// use smget to get semaphores with read write permissions
	getSemaphores();
	// initialize semaphores
	createSemaphores();

	// create child processes
	int pid_tob = fork();
	if(pid_tob < 0) { perror("pid_tob"); exit(EXIT_FAILURE); }
	if(pid_tob == 0) {
		while(1) {
			// in smoker with tobacco
			P(stob);	// wait for signal
			P(smutex);	// wait to modify buffer
			smoker_t();	// roll up cigarette
			V(sage);	// signal agent
			V(smutex);	// signal that buffer can now be modified again
		}
	}else {
		int pid_pap = fork();
		if(pid_pap < 0) { perror("pid_pap"); exit(EXIT_FAILURE); }
		if(pid_pap == 0) {
			while(1) {
				// in smoker with paper
				P(spap);
				P(smutex);
				smoker_p();
				V(sage);
				V(smutex);
			}

		}else {
			int pid_mat = fork();
			if(pid_mat < 0) { perror("pid_mat"); exit(EXIT_FAILURE); }
			if(pid_mat == 0) {
				while(1) {
					// in smoker with matches
					P(smat);
					P(smutex);
					smoker_m();
					V(sage);
					V(smutex);
				}
			}else {
				// in agent
				int i;
				for(int i = 0; i < N; ++i) {
					P(smutex);	// wait for signal to modify buffer

					agent();	// place items on table
					
					// signal the smoker with the remaining item
					int supply = *buffer;
					if(supply == TOBACCO) V(stob);
					else if(supply == PAPER) V(spap);
					else V(smat);

					V(smutex);	// done modifying buffer
					P(sage);	// now wait while a smoker process loop finishes
					putchar('\n');
				}

				// infinite loop, so kill child processes on exit
				kill(pid_pap, SIGUSR1);
				kill(pid_tob, SIGUSR1);
				kill(pid_mat, SIGUSR1);
				exit(EXIT_SUCCESS);
			}
		}
	}
}