Directly using VirtualBox from Java #5
3 changed files with 73 additions and 6 deletions
|
@ -5,10 +5,16 @@ import com.aparapi.Range;
|
||||||
import com.sun.jna.Native;
|
import com.sun.jna.Native;
|
||||||
import com.sun.jna.Pointer;
|
import com.sun.jna.Pointer;
|
||||||
import jnr.ffi.LibraryLoader;
|
import jnr.ffi.LibraryLoader;
|
||||||
|
import org.bukkit.Color;
|
||||||
|
import org.bukkit.map.MapPalette;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
import java.nio.Buffer;
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
import java.util.stream.IntStream;
|
||||||
|
import java.util.stream.LongStream;
|
||||||
|
|
||||||
public class Test {
|
public class Test {
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
|
@ -20,18 +26,47 @@ public class Test {
|
||||||
System.out.println(bb.get(0)); //19 AYY //TO!DO: Use setSource, we don't want to wrap the native array*/
|
System.out.println(bb.get(0)); //19 AYY //TO!DO: Use setSource, we don't want to wrap the native array*/
|
||||||
//final int[] a={5,6,8,2,3,10,5,26,5,416,41,85,416,41};
|
//final int[] a={5,6,8,2,3,10,5,26,5,416,41,85,416,41};
|
||||||
//final int[] b={10,80,10,3,32,20,56,85,51,968,156,5894,10,60,52};
|
//final int[] b={10,80,10,3,32,20,56,85,51,968,156,5894,10,60,52};
|
||||||
final int[] a={5,6};
|
//final int[] a={5,6};
|
||||||
final int[] b={10,80};
|
//final int[] b={10,80};
|
||||||
|
long t=System.nanoTime();
|
||||||
|
int[] a= IntStream.range(0, 640*480).toArray();
|
||||||
final int[] res=new int[a.length];
|
final int[] res=new int[a.length];
|
||||||
Kernel kernel=new Kernel() {
|
Kernel kernel=new Kernel() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
int i=getGlobalId();
|
int i=getGlobalId();
|
||||||
//System.out.println(i);
|
//System.out.println(i);
|
||||||
res[i]=a[i]+b[i];
|
//res[i]=a[i]+b[i];
|
||||||
|
Color c=Color.fromBGR((int)a[i]);
|
||||||
|
res[i]= MapPalette.matchColor(c.getRed(), c.getGreen(), c.getBlue());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
kernel.execute(Range.create(res.length));
|
kernel.execute(Range.create(res.length));
|
||||||
System.out.println(Arrays.toString(res));
|
//System.out.println(Arrays.toString(res));
|
||||||
|
System.out.println(a[10]);
|
||||||
|
System.out.println("OpenCL time: "+(System.nanoTime()-t)/1000000f+"ms");
|
||||||
|
|
||||||
|
t=System.nanoTime();
|
||||||
|
for (int i = 0; i < res.length; i++) {
|
||||||
|
Color c=Color.fromBGR((int)a[i]);
|
||||||
|
res[i]= MapPalette.matchColor(c.getRed(), c.getGreen(), c.getBlue());
|
||||||
|
}
|
||||||
|
System.out.println("For loop time: "+(System.nanoTime()-t)/1000000f+"ms");
|
||||||
|
|
||||||
|
t=System.nanoTime();
|
||||||
|
System.arraycopy(a, 0, res, 0, res.length);
|
||||||
|
System.out.println("Sys time: "+(System.nanoTime()-t)/1000000f+"ms");
|
||||||
|
|
||||||
|
PXCLib pxc = LibraryLoader.create(PXCLib.class).search(new File("").getAbsolutePath()).load("pxc");
|
||||||
|
ByteBuffer bb=ByteBuffer.allocateDirect(640*480);
|
||||||
|
try {
|
||||||
|
Field f=Buffer.class.getDeclaredField("address");
|
||||||
|
f.setAccessible(true);
|
||||||
|
long addr= (long) f.get(bb);
|
||||||
|
pxc.setSource(addr, 640, 480, 5, 4);
|
||||||
|
pxc.updateAndGetMap(0, 0, 640, 480, null);
|
||||||
|
} catch (NoSuchFieldException | IllegalAccessException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
24
libpxc/pxc.c
24
libpxc/pxc.c
|
@ -38,6 +38,18 @@ void setSource(addr address, short w, short h, short mcx, short mcy) {
|
||||||
image=(void*)address;
|
image=(void*)address;
|
||||||
maps=malloc(MAPSIZE*MAPSIZE*mcx*mcy); //1 byte per pixel
|
maps=malloc(MAPSIZE*MAPSIZE*mcx*mcy); //1 byte per pixel
|
||||||
width=w, height=h, mapcx=mcx, mapcy=mcy;
|
width=w, height=h, mapcx=mcx, mapcy=mcy;
|
||||||
|
printf("PXC: w=%d h=%d mcx=%d mcy=%d\n", w, h, mcx, mcy);
|
||||||
|
}
|
||||||
|
|
||||||
|
NativeColor* getNativeColor(int x, int y) {
|
||||||
|
if(x<0||x>width||y<0||y>height) return NULL;
|
||||||
|
return ((NativeColor*)image)+x+y*width;
|
||||||
|
}
|
||||||
|
|
||||||
|
char* getMapColor(int x, int y) {
|
||||||
|
if(x<0||x>width||y<0||y>height) return NULL;
|
||||||
|
int mc=x/MAPSIZE+y/MAPSIZE*mapcx;
|
||||||
|
return maps+mc*MAPSIZE*MAPSIZE; //TODO: Use
|
||||||
}
|
}
|
||||||
|
|
||||||
//May return 0
|
//May return 0
|
||||||
|
@ -45,16 +57,25 @@ void* updateAndGetMap(int x, int y, int w, int h, int** out_changed) { //TODO: S
|
||||||
if(image==NULL || maps==NULL) return 0;
|
if(image==NULL || maps==NULL) return 0;
|
||||||
char* mapp = maps;
|
char* mapp = maps;
|
||||||
NativeColor* imgp = image;
|
NativeColor* imgp = image;
|
||||||
|
printf("PXC: mapp=%p imgp=%p\n", mapp, imgp);
|
||||||
for(int k=0; k<mapcx; k++) {
|
for(int k=0; k<mapcx; k++) {
|
||||||
|
printf("PXC: k=%d\n", k);
|
||||||
for(int l=0; l<mapcy; l++) {
|
for(int l=0; l<mapcy; l++) {
|
||||||
|
printf("PXC: l=%d\n", l);
|
||||||
mapp = maps + MAPSIZE*k + MAPSIZE*mapcx*MAPSIZE*l; //Go to the start of the map
|
mapp = maps + MAPSIZE*k + MAPSIZE*mapcx*MAPSIZE*l; //Go to the start of the map
|
||||||
|
printf("PXC: mapp=%p imgp=%p - %d\n", mapp, imgp, *mapp);
|
||||||
for(short i=0; i<MAPSIZE; i++) { //We need to jump
|
for(short i=0; i<MAPSIZE; i++) { //We need to jump
|
||||||
for(short j=0; j<MAPSIZE; j++) {
|
for(short j=0; j<MAPSIZE; j++) {
|
||||||
*mapp=matchColor(*imgp);
|
//*mapp=matchColor(*imgp); - TODO
|
||||||
|
NativeColor x={.red=0, .green=0, .blue=255};
|
||||||
|
*mapp=matchColor(x);
|
||||||
|
printf("PXC: imgp: %ld - %x\n", (void*)imgp-image, *imgp); //TODO: The bottom of the image
|
||||||
|
printf("PXC: mapcx: %d mapcy: %d\n", k, l); //TODO: Has nothing
|
||||||
imgp++; //Increment by the size of NativeColor so 4
|
imgp++; //Increment by the size of NativeColor so 4
|
||||||
mapp++;
|
mapp++;
|
||||||
}
|
}
|
||||||
imgp+=width-MAPSIZE; //Go back to the first column
|
imgp+=width-MAPSIZE; //Go back to the first column
|
||||||
|
//printf("Row done, imgp=%p\n", imgp);
|
||||||
}
|
}
|
||||||
imgp+=MAPSIZE; //Go to the next map, kind of - TODO: Use X and Y coords!
|
imgp+=MAPSIZE; //Go to the next map, kind of - TODO: Use X and Y coords!
|
||||||
if((void*)mapp - maps > MAPSIZE * MAPSIZE * mapcx * mapcy ||
|
if((void*)mapp - maps > MAPSIZE * MAPSIZE * mapcx * mapcy ||
|
||||||
|
@ -64,6 +85,7 @@ void* updateAndGetMap(int x, int y, int w, int h, int** out_changed) { //TODO: S
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
printf("PXC: ret maps=%p\n", maps);
|
||||||
return maps; //TODO: Return changed only
|
return maps; //TODO: Return changed only
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
/* https://www.cprogramming.com/tutorial/shared-libraries-linux-gcc.html
|
/* https://www.cprogramming.com/tutorial/shared-libraries-linux-gcc.html
|
||||||
gcc -Wall -c -fpic pxc.c
|
gcc -Wall -c -fpic pxc.c
|
||||||
|
@ -8,8 +9,17 @@ gcc -Wall pxct.c -L. -lpxc -Wl,-rpath=.
|
||||||
|
|
||||||
int convert(int px[], int *out[]);
|
int convert(int px[], int *out[]);
|
||||||
|
|
||||||
|
typedef long long int addr;
|
||||||
|
void setSource(addr address, short w, short h, short mcx, short mcy);
|
||||||
|
void* updateAndGetMap(int x, int y, int w, int h, int** out_changed);
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
convert(NULL, NULL);
|
printf("Setting source...");
|
||||||
|
void* p = malloc(640*480*4);
|
||||||
|
setSource((addr)p, 640, 480, 5, 4);
|
||||||
|
printf("Updating map...");
|
||||||
|
void* x=updateAndGetMap(0, 0, 640, 480, NULL);
|
||||||
|
free(p);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue