using Cairo;
using Crow.Linux;
using Crow;
+using System.Reflection;
+using System.Linq;
namespace testDrm
{
public class TestApp : Application, IValueChange
{
+ [STAThread]
static void Main ()
{
+ System.Threading.Thread.CurrentThread.Name = "Main";
try {
using (TestApp crowApp = new TestApp ()) {
crowApp.Run ();
} catch (Exception ex) {
Console.WriteLine (ex.ToString ());
}
+ Console.WriteLine ("terminating");
}
#region IValueChange implementation
}
#endregion
- public bool Running = true;
+
public TestApp () : base () {
}
- int frTime = 0;
- int frMin = int.MaxValue;
- int frMax = 0;
+
+ public int frameTime = 0;
+ public int frameMin = int.MaxValue;
+ public int frameMax = 0;
+ #region Test values for Binding
+// public int intValue = 500;
+// DirectoryInfo curDir = new DirectoryInfo (System.IO.Path.GetDirectoryName(Assembly.GetEntryAssembly().Location));
+// public FileSystemInfo[] CurDirectory {
+// get { return curDir.GetFileSystemInfos (); }
+// }
+// public int IntValue {
+// get {
+// return intValue;
+// }
+// set {
+// intValue = value;
+// NotifyValueChanged ("IntValue", intValue);
+// }
+// }
+// void onSpinnerValueChange(object sender, ValueChangeEventArgs e){
+// if (e.MemberName != "Value")
+// return;
+// intValue = Convert.ToInt32(e.NewValue);
+// }
+// void change_alignment(object sender, EventArgs e){
+// RadioButton rb = sender as RadioButton;
+// if (rb == null)
+// return;
+// NotifyValueChanged ("alignment", Enum.Parse(typeof(Alignment), rb.Caption));
+// }
+// public IList<String> List2 = new List<string>(new string[]
+// {
+// "string1",
+// "string2",
+// "string3",
+// }
+// );
+// public IList<String> TestList2 {
+// set{
+// List2 = value;
+// NotifyValueChanged ("TestList2", testList);
+// }
+// get { return List2; }
+// }
+ IList<Crow.Color> testList = Crow.Color.ColorDic;
+ public IList<Crow.Color> TestList {
+ set{
+ testList = value;
+ NotifyValueChanged ("TestList", testList);
+ }
+ get { return testList; }
+ }
+// string curSources = "";
+// public string CurSources {
+// get { return curSources; }
+// set {
+// if (value == curSources)
+// return;
+// curSources = value;
+// NotifyValueChanged ("CurSources", curSources);
+// }
+// }
+// bool boolVal = true;
+// public bool BoolVal {
+// get { return boolVal; }
+// set {
+// if (boolVal == value)
+// return;
+// boolVal = value;
+// NotifyValueChanged ("BoolVal", boolVal);
+// }
+// }
+
+ #endregion
public override void Run ()
- {
+ {
Stopwatch frame = new Stopwatch ();
- Load ("#testDrm.ui.menu.crow").DataSource = this;
- Load ("#testDrm.ui.0.crow").DataSource = this;
- Load ("#testDrm.ui.0.crow").DataSource = this;
- Load ("#testDrm.ui.0.crow").DataSource = this;
- Load ("#testDrm.ui.0.crow").DataSource = this;
+// Load ("#testDrm.ui.menu.crow").DataSource = this;
+// Load ("#testDrm.ui.0.crow").DataSource = this;
+// Load ("#testDrm.ui.0.crow").DataSource = this;
+// Load ("#testDrm.ui.0.crow").DataSource = this;
+ System.Threading.Thread.Sleep (50);
+ Load ("#testDrm.ui.menu.crow").DataSource = this;
+ int i = 0;
while(Running){
try {
frame.Restart();
+ i++;
+
base.Run ();
+
frame.Stop();
- frTime = (int)frame.ElapsedTicks;
- NotifyValueChanged("frameTime", frTime);
- if (frTime > frMax){
- frMax = frTime;
- NotifyValueChanged("frameMax", frMax);
+ frameTime = (int)frame.ElapsedTicks;
+ NotifyValueChanged("frameTime", frameTime);
+ if (frameTime > frameMax){
+ frameMax = frameTime;
+ NotifyValueChanged("frameMax", frameMax);
}
- if (frTime < frMin){
- frMin = frTime;
- NotifyValueChanged("frameMin", frMin);
+ if (frameTime < frameMin){
+ frameMin = frameTime;
+ NotifyValueChanged("frameMin", frameMin);
}
} catch (Exception ex) {
{
Running = false;
}
+ void onLoadClick(object send, Crow.MouseButtonEventArgs e)
+ {
+ Console.WriteLine ("********** LOADING ui item ******************");
+ GraphicObject go = Load ("#testDrm.ui.2.crow");
+ Console.WriteLine ("********** SETTING DATASOURCE ON ITEM ******************");
+ go.DataSource = this;
+ Console.WriteLine ("********** LOADING FINISHED ******************");
+ }
}
}
namespace Crow
{
public class Application : IDisposable
- {
+ {
+ public bool Running = true;
DRI.GPUControler gpu;
Cairo.GLSurface cairoSurf;
//
Crow.XCursor cursor;
int previousVT = -1, appVT = -1;
-//
- public Application(){
+ public Application(){
if (Kernel.signal (Signal.SIGUSR1, switch_request_handle) < 0)
throw new Exception ("signal handler registation failed");
if (Kernel.signal (Signal.SIGINT, sigint_handler) < 0)
gpu = new DRI.GPUControler();
cairoSurf = gpu.CairoSurf;
- cursor = Crow.XCursorFile.Load("#Crow.Images.Icons.Cursors.arrow").Cursors[0];
-
CrowInterface = new Interface ();
Thread t = new Thread (interfaceThread);
+ t.Name = "Interface";
t.IsBackground = true;
t.Start ();
initInput ();
CrowInterface.ProcessResize (new Size (gpu.Width, gpu.Height));
+ cursor = Crow.XCursorFile.Load("#Crow.Images.Icons.Cursors.arrow").Cursors[0];
gpu.updateCursor (cursor);
//CrowInterface.MouseCursorChanged += CrowInterface_MouseCursorChanged;
}
}
}
void sigint_handler (Signal s){
- Console.WriteLine ("SIGINT catched");
- //Running = false;
+ Console.WriteLine ("{0}: SIGINT catched");
+ Running = false;
}
// void CrowInterface_MouseCursorChanged (object sender, MouseCursorChangedEventArgs e)
// {
// using (Cairo.Context ctx = new Cairo.Context (cairoSurf)) {
// ctx.Rectangle (0, 0, gpu.Width, gpu.Height);
-// ctx.SetSourceRGB (0, 0, 0.1);
+// ctx.SetSourceRGB (0, 0, 1);
+// ctx.Fill ();
+// ctx.Rectangle (5, 5, 50, 50);
+// ctx.SetSourceRGB (1, 0, 0);
+// ctx.Fill ();
+// ctx.Rectangle (1550, 850, 50, 50);
+// ctx.SetSourceRGB (0, 1, 0);
// ctx.Fill ();
// }
if (Monitor.TryEnter (CrowInterface.RenderMutex)) {
}
Monitor.Exit (CrowInterface.RenderMutex);
}
-
+//
// if (!update)
// return;
// update = false;
cairoSurf.SwapBuffers ();
gpu.Update ();
+ //Thread.Sleep (1);
+ //gpu.MarkFBDirty ();
}
void initInput (){
Semaphore ready = new Semaphore(0, 1);
input_thread = new Thread (InputThreadLoop);
+ input_thread.Name = "input_thread";
input_thread.IsBackground = true;
input_thread.Start(ready);
}
[DllImportAttribute("libEGL.dll", EntryPoint = "eglWaitNative")]
[return: MarshalAsAttribute(UnmanagedType.I1)]
public static extern bool WaitNative(int engine);
- [DllImportAttribute("libEGL.dll", EntryPoint = "eglSwapBuffers")]
- [return: MarshalAsAttribute(UnmanagedType.I1)]
- public static extern bool SwapBuffers(EGLDisplay dpy, EGLSurface surface);
[DllImportAttribute("libEGL.dll", EntryPoint = "eglCopyBuffers")]
[return: MarshalAsAttribute(UnmanagedType.I1)]
public static extern bool CopyBuffers(EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target);
{
#region pinvoke
[DllImportAttribute("libEGL.dll")]
- public static extern EGLSurface eglCreateWindowSurface(EGLDisplay dpy, EGLConfig config, IntPtr win, IntPtr attrib_list);
+ internal static extern EGLSurface eglCreateWindowSurface(EGLDisplay dpy, EGLConfig config, IntPtr win, IntPtr attrib_list);
[DllImportAttribute("libEGL.dll")]
- public static extern EGLSurface eglCreatePbufferSurface(EGLDisplay dpy, EGLConfig config, int[] attrib_list);
+ internal static extern EGLSurface eglCreatePbufferSurface(EGLDisplay dpy, EGLConfig config, int[] attrib_list);
[DllImportAttribute("libEGL.dll")]
- public static extern EGLSurface eglCreatePixmapSurface(EGLDisplay dpy, EGLConfig config, EGLNativePixmapType pixmap, int[] attrib_list);
+ internal static extern EGLSurface eglCreatePixmapSurface(EGLDisplay dpy, EGLConfig config, EGLNativePixmapType pixmap, int[] attrib_list);
[DllImportAttribute("libEGL.dll")][return: MarshalAsAttribute(UnmanagedType.I1)]
- public static extern bool eglDestroySurface(EGLDisplay dpy, EGLSurface surface);
+ internal static extern bool eglDestroySurface(EGLDisplay dpy, EGLSurface surface);
[DllImportAttribute("libEGL.dll")][return: MarshalAsAttribute(UnmanagedType.I1)]
- public static extern bool eglQuerySurface(EGLDisplay dpy, EGLSurface surface, int attribute, out int value);
+ internal static extern bool eglQuerySurface(EGLDisplay dpy, EGLSurface surface, int attribute, out int value);
[DllImportAttribute("libEGL.dll")]
- public static extern EGLSurface eglCreatePbufferFromClientBuffer(EGLDisplay dpy, int buftype, EGLClientBuffer buffer, EGLConfig config, int[] attrib_list);
+ internal static extern EGLSurface eglCreatePbufferFromClientBuffer(EGLDisplay dpy, int buftype, EGLClientBuffer buffer, EGLConfig config, int[] attrib_list);
[DllImportAttribute("libEGL.dll")][return: MarshalAsAttribute(UnmanagedType.I1)]
- public static extern bool eglSurfaceAttrib(EGLDisplay dpy, EGLSurface surface, int attribute, int value);
+ internal static extern bool eglSurfaceAttrib(EGLDisplay dpy, EGLSurface surface, int attribute, int value);
[DllImportAttribute("libEGL.dll")][return: MarshalAsAttribute(UnmanagedType.I1)]
- public static extern bool eglBindTexImage(EGLDisplay dpy, EGLSurface surface, int buffer);
+ internal static extern bool eglBindTexImage(EGLDisplay dpy, EGLSurface surface, int buffer);
[DllImportAttribute("libEGL.dll")][return: MarshalAsAttribute(UnmanagedType.I1)]
- public static extern bool eglReleaseTexImage(EGLDisplay dpy, EGLSurface surface, int buffer);
+ internal static extern bool eglReleaseTexImage(EGLDisplay dpy, EGLSurface surface, int buffer);
+ [DllImportAttribute("libEGL.dll")][return: MarshalAsAttribute(UnmanagedType.I1)]
+ internal static extern bool eglSwapBuffers(EGLDisplay dpy, EGLSurface surface);
+
#endregion
Context ctx;
if (!Context.MakeCurrent(ctx.dpy, handle, handle, ctx.ctx))
throw new NotSupportedException(string.Format("eglMakeCurrent on surface Failed: {0}",Context.GetError()));
}
+ public void SwapBuffers () {
+ if (!eglSwapBuffers (ctx.dpy, handle))
+ throw new NotSupportedException(string.Format("eglSwapBuffers Failed: {0}",Context.GetError()));
+ }
#region IDisposable implementation
~Surface(){
using System.Runtime.InteropServices;
using System.Collections.Generic;
using System.Diagnostics;
+using System.Threading;
namespace Linux.DRI {
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
Resources resources = null;
Connector connector = null;
Crtc currentCrtc = null;
- ModeInfo currentMode;
+ ModeInfo currentMode, originalMode;
+ uint originalFB;
public GPUControler(string gpu_path = "/dev/dri/card0"){
fd_gpu = Libc.open(gpu_path, OpenFlags.ReadWrite | OpenFlags.CloseOnExec);
public int Width { get { return (int)currentMode.hdisplay; }}
public int Height { get { return (int)currentMode.vdisplay; }}
+ ModeInfo getNewMode(){
+ ModeInfo mode = currentCrtc.CurrentMode;
+ mode.clock = 118250;
+ mode.hdisplay = 1600;
+ mode.hsync_start = 1696;
+ mode.hsync_end = 1856;
+ mode.htotal = 2112;
+ mode.vdisplay = 900;
+ mode.vsync_start = 903;
+ mode.vsync_end = 908;
+ mode.vtotal = 934;
+ mode.flags |= (uint)VideoMode.NHSYNC;
+ mode.flags |= (uint)VideoMode.PVSYNC;
+ return mode;
+ }
+ unsafe void setNewMode(){
+
+ //currentCrtc.handle->mode = currentMode;
+// ModeInfo* mode = (ModeInfo*)Marshal.AllocHGlobal (sizeof(ModeInfo));// pConnector->modes;
+// *mode = currentMode;
+
+ uint fb;
+ GBM.gbm_bo* bo = GBM.BufferObject.gbm_bo_create (gbmDev.handle, (uint)Width, (uint)Height, GBM.SurfaceFormat.ARGB8888, GBM.SurfaceFlags.Scanout);
+ int ret = drmModeAddFB (fd_gpu, (uint)Width, (uint)Height, (byte)depth, (byte)bpp, bo->Stride, (uint)bo->Handle32, out fb);
+ if (ret != 0)
+ Console.WriteLine ("addFb failed: {0}", ret);
+ bo->SetUserData ((IntPtr)fb, handleDestroyFB);
+
+ uint connId = connector.Id;
+ ret = drmModeSetCrtc (fd_gpu, currentCrtc.Id, fb, 0, 0, &connId, 1, ref currentMode);
+ if (ret != 0)
+ Console.WriteLine ("set new mode setCrtc failed: {0}", ret);
+ //GBM.BufferObject.gbm_bo_destroy (bo);
+
+ //Console.WriteLine ("new mode set to {0} x {1}", Width, Height);
+ }
bool defaultConfiguration (){
//select the first connected connector
foreach (Connector c in resources.Connectors) {
return false;
currentCrtc = connector.CurrentEncoder.CurrentCrtc;
- currentMode = currentCrtc.CurrentMode;
-
+ originalMode = currentCrtc.CurrentMode;
+ originalFB = currentCrtc.CurrentFbId;
+ currentMode = getNewMode();
+
+
//configure a rendering stack
gbmSurf = new GBM.Surface (gbmDev, Width, Height,
GBM.SurfaceFlags.Rendering | GBM.SurfaceFlags.Scanout);
+ //setNewMode ();
+
eglSurf = new EGL.Surface (eglctx, gbmSurf);
eglSurf.MakeCurrent ();
if (cairoDev.Acquire () != Cairo.Status.Success)
Console.WriteLine ("[Cairo]: Failed to acquire egl device.");
-
+
+// using (Cairo.Context ctx = new Cairo.Context (CairoSurf)) {
+// ctx.Rectangle (0, 0, Width, Height);
+// ctx.SetSourceRGB (0, 0, 1);
+// ctx.Fill ();
+// }
+// CairoSurf.Flush ();
+// CairoSurf.SwapBuffers ();
+// Update ();
+
+ //Thread.Sleep (1);
return true;
}
void handleDestroyFB(ref GBM.gbm_bo bo, IntPtr data)
int fb = data.ToInt32();
if (fb != 0) {
- if (drmModeRmFB (fd_gpu, fb) != 0)
- Console.WriteLine ("DestroyFB failed");
- else
- Console.WriteLine ("DestroyFB ok fd={0}", fd_gpu);
+ try {
+ if (drmModeRmFB (fd_gpu, fb) != 0)
+ Console.WriteLine ("DestroyFB failed");
+ else
+ Console.WriteLine ("DestroyFB ok fd={0}", fd_gpu);
+ } catch (Exception ex) {
+ Console.WriteLine ("DestroyFB error:" + ex.ToString());
+ }
}
}
GBM.gbm_bo* bo;
uint fb;
-// PollFD fds = new PollFD();
-// fds.fd = fd_gpu;
-// fds.events = PollFlags.In;
-//
-// EventContext evctx = new EventContext();
-// evctx.version = EventContext.Version;
-// evctx.page_flip_handler = PageFlipPtr;
-
-// int timeout = -1;//block ? -1 : 0;
-//
-
if (!gbmSurf.HasFreeBuffers)
throw new NotSupportedException("[GBM] Out of free buffer");
bo = gbmSurf.Lock ();
- //fb = getFbFromBo (bo);
- //unsafe {
- //Console.WriteLine ("current fb: {0}", currentCrtc.CurrentFbId);
- //if (currentCrtc.CurrentFbId == 0)
- int ret = drmModeAddFB (fd_gpu, currentMode.hdisplay, currentMode.vdisplay, (byte)depth, (byte)bpp, bo->Stride, (uint)bo->Handle32, out fb);
- if (ret != 0)
- Console.WriteLine ("addFb failed: {0}", ret);
- //else
- // fb = currentCrtc.CurrentFbId;
- bo->SetUserData ((IntPtr)fb, handleDestroyFB);
+ int ret = drmModeAddFB (fd_gpu, currentMode.hdisplay, currentMode.vdisplay, (byte)depth, (byte)bpp, bo->Stride, (uint)bo->Handle32, out fb);
+ if (ret != 0)
+ Console.WriteLine ("addFb failed: {0}", ret);
+ bo->SetUserData ((IntPtr)fb, handleDestroyFB);
- uint connId = connector.Id;
- ret = drmModeSetCrtc (fd_gpu, currentCrtc.Id, fb, 0, 0, &connId, 1, ref currentMode);
- if (ret != 0)
- Console.WriteLine ("setCrtc failed: {0}", ret);
- //}
- gbmSurf.Release (bo);
+ uint connId = connector.Id;
+ ret = drmModeSetCrtc (fd_gpu, currentCrtc.Id, fb, 0, 0, &connId, 1, ref currentMode);
+ if (ret != 0)
+ Console.WriteLine ("setCrtc failed: {0}", ret);
- //bo.Dispose ();
-//
-// SetScanoutRegion (fb);
-// drmTimeOut.Restart();
-//
-// while (run && drmTimeOut.ElapsedMilliseconds < 10000){
-// BufferObject next_bo;
-// bool update = false;
-//
-// if (updateMousePos) {
-// lock (Sync) {
-// updateMousePos = false;
-// unsafe {
-// Drm.MoveCursor (fd_gpu, pEncoder->crtc_id, MouseX-8, MouseY-4);
-// }
-// }
-// }
-//
-// if (Monitor.TryEnter (CrowInterface.RenderMutex)) {
-// if (CrowInterface.IsDirty) {
-// CrowInterface.IsDirty = false;
-// update = true;
-// using (Cairo.Context ctx = new Cairo.Context (cairoSurf)) {
-// using (Cairo.Surface d = new Cairo.ImageSurface (CrowInterface.dirtyBmp, Cairo.Format.Argb32,
-// width, height, width * 4)) {
-// ctx.SetSourceSurface (d, 0, 0);
-// ctx.Operator = Cairo.Operator.Source;
-// ctx.Paint ();
-// }
-// }
-// }
-// Monitor.Exit (CrowInterface.RenderMutex);
-// }
-//
-// if (!update)
-// continue;
-// update = false;
-//
-// cairoSurf.Flush ();
-// cairoSurf.SwapBuffers ();
-//
-// if (Gbm.HasFreeBuffers (gbm_surface) == 0)
-// throw new Exception ("[GBM]: Out of free buffers.");
-//
-// next_bo = Gbm.LockFrontBuffer (gbm_surface);
-// if (next_bo == BufferObject.Zero)
-// throw new Exception ("[GBM]: Failed to lock front buffer.");
-//
-// fb = getFbFromBo (next_bo);
-//
-// unsafe{
-// int is_flip_queued = 1;
-//
-// while (Drm.ModePageFlip (fd_gpu, pEncoder->crtc_id, fb, PageFlipFlags.FlipEvent, ref is_flip_queued) < 0) {
-// //Console.WriteLine ("[DRM] Failed to enqueue framebuffer flip.");
-// continue;
-// }
-//
-// while (is_flip_queued != 0)
-// {
-// fds.revents = 0;
-// if (Libc.poll (ref fds, 1, timeout) < 0)
-// break;
-//
-// if ((fds.revents & (PollFlags.Hup | PollFlags.Error)) != 0)
-// break;
-//
-// if ((fds.revents & PollFlags.In) != 0)
-// Drm.HandleEvent (fd_gpu, ref evctx);
-// else
-// break;
-// Thread.Sleep (1);
-// }
-// if (is_flip_queued != 0)
-// Console.WriteLine ("flip canceled");
-//
-// Gbm.ReleaseBuffer (gbm_surface, bo);
-// //Drm.ModeRmFB(fd_gpu, fb);
-//
-// bo = next_bo;
-// next_bo = BufferObject.Zero;
-//
-// }
-// }
+ gbmSurf.Release (bo);
+ }
+ [StructLayout(LayoutKind.Sequential)]
+ struct drmClip {
+ public ushort x1;
+ public ushort y1;
+ public ushort x2;
+ public ushort y2;
+ }
+ unsafe public void MarkFBDirty(){
+ IntPtr pClip = Marshal.AllocHGlobal (sizeof(drmClip));
+ drmClip dc = new drmClip () { x1 = 0, y1 = 0, x2 = 500, y2 = 500 };
+ Marshal.StructureToPtr (dc, pClip,false);
+ int ret = drmModeDirtyFB (fd_gpu, currentCrtc.CurrentFbId, IntPtr.Zero, 0);
+ if (ret < 0)
+ Console.WriteLine ("set FB dirty failed: {0}", ret);
}
-
#region cursor
GBM.BufferObject boMouseCursor;
drmModeMoveCursor (fd_gpu, currentCrtc.Id, x, y);
}
#endregion
-// void initGbm (){
-// gbm_surface = Gbm.CreateSurface(gbm_device, mode.hdisplay, mode.vdisplay, SurfaceFormat.ARGB8888, SurfaceFlags.Rendering | SurfaceFlags.Scanout);
-// if (gbm_surface == IntPtr.Zero)
-// throw new NotSupportedException("[GBM] Failed to create GBM surface for rendering");
-//
-// unsafe {
-// gbm_bo* bo = Gbm.CreateBO (gbm_device, mode.hdisplay, mode.vdisplay, SurfaceFormat.ARGB8888, SurfaceFlags.Scanout);
-// if (bo == null)
-// Console.WriteLine ("failed to create a BufferObject for screen 0");
-// else {
-// uint fb_id = screens [0].BindBuffer (bo);
-// // if (paint (bo))
-// // Console.WriteLine ("[DRI] bo paint succeed");
-// // ModeDirtyFB (fd_gpu, fb_id, IntPtr.Zero, 0);
-// }
-// // //Gbm.DestroyBuffer (bo);
-// ModeAddFB (fd_gpu, bo->Width, bo->Height,(byte)depth, (byte)bpp, bo->Stride, bo->Handle32, out fb_id);
-// bo->SetUserData ((IntPtr)fb_id, IntPtr.Zero);
-//
-// int ret = ModeSetCrtc(fd_gpu, crtc_id, fb_id, x, y, &connector_id, 1, ref mode);
-// }
-// }
+
// unsafe public drmPlane GetPlane (uint id) {
// drmPlane p = new drmPlane();
// drmPlane* pPlane = ModeGetPlane (fd_gpu, id);
CairoSurf = null;
}
+ uint connId = connector.Id;
+ unsafe{
+ int ret = drmModeSetCrtc (fd_gpu, currentCrtc.Id, originalFB, 0, 0, &connId, 1, ref originalMode);
+ if (ret != 0)
+ Console.WriteLine ("restore Crtc failed: {0}", ret);
+ }
+
if (boMouseCursor != null)
boMouseCursor.Dispose ();
boMouseCursor = null;
byte bpp, uint stride, uint bo_handle, out uint buf_id);
[DllImport(lib, CallingConvention = CallingConvention.Cdecl)]
public static extern int drmModeRmFB(int fd, int bufferId);
- [DllImport(lib, EntryPoint = "drmModeDirtyFB", CallingConvention = CallingConvention.Cdecl)]
- public static extern int ModeDirtyFB(int fd, uint bufferId, IntPtr clips, uint num_clips);
-
+ [DllImport(lib, CallingConvention = CallingConvention.Cdecl)]
+ public static extern int drmModeDirtyFB(int fd, uint bufferId, IntPtr clips, uint num_clips);
[DllImport(lib, EntryPoint = "drmModeGetFB", CallingConvention = CallingConvention.Cdecl)]
unsafe internal static extern drmFrameBuffer* ModeGetFB(int fd, uint fb_id);
[DllImport(lib, CallingConvention = CallingConvention.Cdecl)]
unsafe static extern int drmModeSetCrtc(int fd, uint crtcId, uint bufferId, uint x, uint y, uint* connectors, int count, ref ModeInfo mode);
+ [DllImport(lib, EntryPoint = "drmModeSetCrtc", CallingConvention = CallingConvention.Cdecl)]
+ unsafe static extern int ModeSetCrtc(int fd, uint crtcId, uint bufferId, uint x, uint y, uint* connectors, int count, ModeInfo* mode);
+
[DllImport(lib, CallingConvention = CallingConvention.Cdecl)]
internal static extern int drmModeSetCursor2(int fd, uint crtcId, uint bo_handle, uint width, uint height, int hot_x, int hot_y);
#endregion
int fd_gpu;
- drmConnector* handle;
+ internal drmConnector* handle;
#region ctor
public Connector (int _fd_gpu, uint _id)
#endregion
int fd_gpu;
- drmEncoder* handle;
+ internal drmEncoder* handle;
#region ctor
unsafe internal Encoder (int _fd_gpu, uint _id)
{
#region pinvoke
[DllImport("gbm", CallingConvention = CallingConvention.Cdecl)]
- static extern gbm_bo* gbm_bo_create (IntPtr gbm, uint width, uint height, SurfaceFormat format, SurfaceFlags flags);
+ internal static extern gbm_bo* gbm_bo_create (IntPtr gbm, uint width, uint height, SurfaceFormat format, SurfaceFlags flags);
[DllImport("gbm", CallingConvention = CallingConvention.Cdecl)]
internal static extern void gbm_bo_destroy (gbm_bo* bo);
[DllImport("gbm", CallingConvention = CallingConvention.Cdecl)]
--- /dev/null
+FpsLabel {
+ Width = 50%;
+ Font = droid, 10;
+ Margin = 0;
+ TextAlignment = Center;
+ Background = Onyx;
+}
+FpsDisp {
+ Font = droid bold, 10;
+ Width = 50%;
+ Margin = 0;
+ TextAlignment = Center;
+ Background = Teal;
+}
+CheckBox2 {
+ Template= #Tests.Interfaces.CheckBox2.imlt;
+ Background = Onyx;
+ Checked={Background=Mantis;Font=droid bold, 10};
+ Unchecked = {Background=Onyx;Font=droid,10};
+}
+RadioButton2 {
+ Template=#Tests.Interfaces.CheckBox2.imlt;
+ Background = Onyx;
+ Checked = {Background=Mantis;Font=droid bold, 10};
+ Unchecked = {Background=Onyx;Font=droid,10};
+}
+labPerf {
+ Font = droid, 8;
+ Width = 50%;
+}
+labPerfVal{
+ Font = droid, 8;
+ Width = 50%;
+}
<DefineConstants>DEBUG;</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
- <ConsolePause>false</ConsolePause>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<IntermediateOutputPath>$(SolutionDir)build\obj\$(Configuration)</IntermediateOutputPath>
- <OutputPath>$(SolutionDir)build\$(Configuration)</OutputPath>
+ <OutputPath>$(SolutionDir)build\Debug</OutputPath>
+ <Externalconsole>true</Externalconsole>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>full</DebugType>
<ConsolePause>false</ConsolePause>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<IntermediateOutputPath>$(SolutionDir)build\obj\$(Configuration)</IntermediateOutputPath>
- <OutputPath>$(SolutionDir)build\$(Configuration)</OutputPath>
+ <OutputPath>$(SolutionDir)build\Release</OutputPath>
</PropertyGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<ItemGroup>
<ItemGroup>
<EmbeddedResource Include="ui\menu.crow" />
<EmbeddedResource Include="ui\0.crow" />
+ <EmbeddedResource Include="ui\1.crow" />
+ <EmbeddedResource Include="ui\2.crow" />
+ <EmbeddedResource Include="ui\colorItem.crow" />
+ <EmbeddedResource Include="test.style" />
</ItemGroup>
<ItemGroup>
<None Include="src\DRMContext.cs" />
<DirectoryView Name="dv" CurrentDirectory="/" Margin="1"/>
</Border>
<Splitter/>-->
- <ListBox Name="colorList" Data="{TestList}" Margin="5"
- ItemTemplate="#Tests.Interfaces.colorItem.crow"
- Template="#Crow.Templates.ScrollingListBox.goml"
- />
+<!-- <ListBox Name="colorList" Data="{TestList}" Margin="5"/>-->
+<!-- ItemTemplate="#testDrm.ui.colorItem.crow"
+ Template="#Crow.Templates.ScrollingListBox.goml"-->
</VerticalStack>
</HorizontalStack>
</Window>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0"?>
+<GraphicObject Width="100" Height="100" Background="Teal"/>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0"?>
+<Window Caption="Performances" Height="160" Width="200">
+ <VerticalStack Width="90%" Height="Fit" Spacing="1" Margin="10">
+ <HorizontalStack>
+ <Label Text="Frame:" Style="FpsLabel"/>
+ <Label Text="{frameTime}" Style="FpsDisp"/>
+ </HorizontalStack>
+ <HorizontalStack>
+ <Label Text="Frame Min:" Style="FpsLabel"/>
+ <Label Text="{frameMin}" Style="FpsDisp"/>
+ </HorizontalStack>
+ <HorizontalStack>
+ <Label Text="FrameMax:" Style="FpsLabel"/>
+ <Label Text="{frameMax}" Style="FpsDisp"/>
+ </HorizontalStack>
+ <HorizontalStack>
+ <Label Text="Update:" Style="FpsLabel"/>
+ <Label Text="{update}" Style="FpsDisp"/>
+ </HorizontalStack>
+ <HorizontalStack>
+ <Label Text="Layouting:" Style="FpsLabel"/>
+ <Label Text="{layouting}" Style="FpsDisp"/>
+ </HorizontalStack>
+ <HorizontalStack>
+ <Label Text="Clipping:" Style="FpsLabel"/>
+ <Label Text="{clipping}" Style="FpsDisp"/>
+ </HorizontalStack>
+ <HorizontalStack>
+ <Label Text="Drawing:" Style="FpsLabel"/>
+ <Label Text="{drawing}" Style="FpsDisp"/>
+ </HorizontalStack>
+
+ </VerticalStack>
+</Window>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0"?>
+<Border Foreground="Transparent" Focusable="true" HorizontalAlignment="Left" Height="Fit" Width="200">
+ <HorizontalStack Margin="0"
+ MouseEnter="{Background=hgradient|0:DarkRed|1:Transparent}"
+ MouseLeave="{Background=Transparent}">
+ <GraphicObject Height="12" Width="20" Background="{}" Margin="0" CornerRadius="3"/>
+ <Label Text="{}" Margin="0" Width="Stretched"/>
+ </HorizontalStack>
+</Border>
+
<?xml version="1.0"?>
<Menu>
<MenuItem Caption="File" Width="Fit">
- <MenuItem Caption="New" />
+ <MenuItem Caption="New" MouseClick="onLoadClick"/>
<MenuItem Caption="Open"/>
<MenuItem Caption="Save"/>
<MenuItem Caption="Quit" MouseClick="onQuitClick"/>