Exemplo n.º 1
0
Arquivo: memory.c Projeto: dche/rcl
/*
 * call-seq:
 *      Memory.create_subbuffer(buffer, , [10, 100])
 *
 */
static VALUE
rcl_mem_create_subbuffer(VALUE mod, VALUE buffer,
                                     VALUE flags,
                                     VALUE region)
{
    EXPECT_RCL_TYPE(buffer, Memory);
    EXPECT_FIXNUM(flags);
    EXPECT_ARRAY(region);

    long i = RARRAY_LEN(region);
    if (i != 2) {
        rb_raise(rb_eArgError, "Expected the parameter region has 2 items, got (%ld).", i);
    }
    VALUE sz = rb_ary_entry(region, 0);
    EXTRACT_SIZE(sz, origin);
    sz = rb_ary_entry(region, 1);
    EXTRACT_SIZE(sz, offset);

    cl_buffer_region br;
    br.origin = origin;
    br.size = offset;

    cl_mem buf = MemoryPtr(buffer);
    cl_mem_flags mf = FIX2INT(flags);

    cl_int res = CL_SUCCESS;
    cl_mem subbuf = clCreateSubBuffer(buf, mf, CL_BUFFER_CREATE_TYPE_REGION, &br, &res);
    CHECK_AND_RAISE(res);

    return RMemory(subbuf);
}
Exemplo n.º 2
0
Arquivo: memory.c Projeto: dche/rcl
static VALUE
rcl_mem_image_info(VALUE self, VALUE param_name)
{
    EXPECT_RCL_CONST(param_name);
    cl_image_info ii = FIX2UINT(param_name);
    cl_mem m = MemoryPtr(self);

    cl_image_format imgfmt;

    cl_int res = clGetImageInfo(m, ii, sizeof(cl_image_format), (void *)&imgfmt, NULL);
    CHECK_AND_RAISE(res);

    switch (ii) {
    case CL_IMAGE_FORMAT:
        return RImageFormat(&imgfmt);
    case CL_IMAGE_ELEMENT_SIZE:
    case CL_IMAGE_ROW_PITCH:
    case CL_IMAGE_SLICE_PITCH:
    case CL_IMAGE_WIDTH:
    case CL_IMAGE_HEIGHT:
    case CL_IMAGE_DEPTH:
        return ULONG2NUM(*(size_t *)&imgfmt);
    }
    return Qnil;
}
Exemplo n.º 3
0
Arquivo: memory.c Projeto: dche/rcl
static VALUE
rcl_mem_info(VALUE self, VALUE param_name)
{
    EXPECT_RCL_CONST(param_name);

    cl_mem_info mi = FIX2UINT(param_name);
    cl_mem m = MemoryPtr(self);
    intptr_t param_value;

    cl_int res = clGetMemObjectInfo(m, mi, sizeof(intptr_t), &param_value, NULL);
    CHECK_AND_RAISE(res);

    switch (mi) {
    case CL_MEM_TYPE:
    case CL_MEM_FLAGS:
    case CL_MEM_SIZE:
    case CL_MEM_MAP_COUNT:
    case CL_MEM_REFERENCE_COUNT:
        return UINT2NUM(param_value);
    case CL_MEM_HOST_PTR:   // CHECK: Should be wrapped to a HostPoiner? MappedPointer? No.
        return ULONG2NUM(param_value);
    case CL_MEM_CONTEXT:
        return RContext((cl_context)param_value);
    default:
        break;
    }

    return Qnil;
}
Exemplo n.º 4
0
//---------------------------------------------------------------------------
long PacketFile::afterOpen (void)
{
	if (!numPackets && getLength() >= 12)
	{
		long firstPacketOffset;
		long firstCheck = readLong();

		if (firstCheck == PACKET_FILE_VERSION && !usesCheckSum)
		{
			
		}
		else
		{
			//---------------------------------------
			// This is probably a checksum.  Check it
			long checkSum = checkSumFile();
			if (checkSum != firstCheck)
				return PACKET_OUT_OF_RANGE;
		}

		firstPacketOffset = readLong();
		
		numPackets = (firstPacketOffset/sizeof(long))-2;
	}

	currentPacket = -1;

	if (fileMode == READ || fileMode == RDWRITE)
	{
		if (numPackets && !seekTable)
		{
			//seekTable = (long *)systemHeap->Malloc(numPackets * sizeof(long));
			seekTable = new long[numPackets]; //magic 02102011
			gosASSERT(seekTable != NULL);
				
			seek(sizeof(long)*2);												//File Version & File Length
			read(MemoryPtr(seekTable),(numPackets*sizeof(long)));
		}
	}
	
	return(NO_ERR);
}
Exemplo n.º 5
0
//---------------------------------------------------------------------------
void PacketFile::reserve (long count, bool useCheckSum)
{
	//---------------------------------------------------
	// If we already have packets, reserve does nothing.
	// Otherwise, reserve sets up the file.  Must be
	// called before any writing to a newly created file.
	if (numPackets)
	{
		return;
	}

	usesCheckSum = useCheckSum;

	numPackets = count;
	long firstPacketOffset = TABLE_ENTRY(numPackets);
	writeLong(PACKET_FILE_VERSION);
	writeLong(firstPacketOffset);

	//----------------------------
	// initialize the seek table
	while (count-- > 0)
		writeLong(SetPacketType(firstPacketOffset,STORAGE_TYPE_NUL));

	//-------------------------------------------------------------
	// If we called this, chances are we are writing a packet file
	// from start to finish.  It is MUCH faster if this table is
	// updated in memory and flushed when the file is closed.
	if (!seekTable)
	{
		//seekTable = (long *)systemHeap->Malloc(numPackets * sizeof(long));
		seekTable = new long[numPackets]; //magic 02102011
   			
   		if (seekTable != NULL)
   		{
   			seek(sizeof(long)*2);							//File Version & File Length
   			read(MemoryPtr(seekTable),(numPackets*sizeof(long)));
   		}
	}
}
Exemplo n.º 6
0
//---------------------------------------------------------------------------
void PacketFile::atClose (void)
{
	if (isOpen() && fileMode != READ)								// update filesize
	{
		long endPtr = getLength();
		
		//seek(sizeof(long));								//Move Past Version Marker
		//writeLong(endPtr);								//Write File length
	
		long tableEntry;
		currentPacket = numPackets;

		if (!seekTable)
		{
			while (--currentPacket >= 0)
			{
				seek(TABLE_ENTRY(currentPacket));
				tableEntry = readLong();
					
				if (GetPacketType(tableEntry) == STORAGE_TYPE_NUL)
				{
					seek(TABLE_ENTRY(currentPacket));
					writeLong(SetPacketType(endPtr,STORAGE_TYPE_NUL));
				}
				else
				{
					endPtr = GetPacketOffset(tableEntry);
				}
			}
		}
		else
		{
			while (--currentPacket >= 0)
			{
				tableEntry = seekTable[currentPacket];
					
				if (GetPacketType(tableEntry) == STORAGE_TYPE_NUL)
				{
					seekTable[currentPacket] = SetPacketType(endPtr,STORAGE_TYPE_NUL);
				}
				else
				{
					endPtr = GetPacketOffset(tableEntry);
				}
			}
		}

		//-----------------------------------------------------
		// If seekTable was being used, write it back to file
		if (seekTable)
		{
			seek(sizeof(long)*2);							//File Version & File Length
			write(MemoryPtr(seekTable),(numPackets*sizeof(long)));
		}

		//------------------------------------------------------
		// Is we were using a checkSum, calc it and write it to
		// the beginning of the file.
		if (usesCheckSum)
		{
			long checkSum = checkSumFile();
			seek(0);
			writeLong(checkSum);
		}
	}
	
	clear();
}