summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorbin Simpson <MostAwesomeDude@gmail.com>2010-04-26 12:57:42 -0700
committerCorbin Simpson <MostAwesomeDude@gmail.com>2010-04-26 12:57:42 -0700
commit475c2e03d14681255a4996937e96355bb266b17c (patch)
treef3d3d395a9c2c6d678b7849e2e68c4f0ac600dc5
parent7c4832d2d3273a10cf2f5f4fd25327fe51965aeb (diff)
Screen.
-rw-r--r--drm.py10
-rwxr-xr-xmain.py6
-rw-r--r--screen.py119
3 files changed, 131 insertions, 4 deletions
diff --git a/drm.py b/drm.py
index 16e92f9..a8030c2 100644
--- a/drm.py
+++ b/drm.py
@@ -1,6 +1,8 @@
#!/usr/bin/env python
from ctypes import *
+import screen
+
class drm_api(Structure):
pass
@@ -9,7 +11,8 @@ drm_api._fields_ = [
("name", c_char_p),
("driver_name", c_char_p),
("create_screen",
- CFUNCTYPE(c_void_p, POINTER(drm_api), c_int, c_void_p)),
+ CFUNCTYPE(POINTER(screen.pipe_screen),
+ POINTER(drm_api), c_int, c_void_p)),
]
class DrmApi(object):
@@ -18,11 +21,12 @@ class DrmApi(object):
self.drm_api = handle.drm_api_create()
def __del__(self):
+ return
self.drm_api[0].destroy(self.drm_api)
def create_screen(self, fd):
- screen = self.drm_api[0].create_screen(self.drm_api, fd, None)
- print screen
+ s = screen.Screen(self.drm_api[0].create_screen(self.drm_api, fd, None))
+ return s
@property
def name(self):
diff --git a/main.py b/main.py
index 8d585a2..1fa201c 100755
--- a/main.py
+++ b/main.py
@@ -20,4 +20,8 @@ print "Loaded drm_api object, name %s" % da.name
screen = da.create_screen(raw.drmOpen(da.name, None))
-del da
+print "Created screen, name %s vendor %s" % (screen.name, screen.vendor)
+if screen["GLSL"]:
+ print "Whoo, GLSL!"
+else:
+ print "No GLSL..."
diff --git a/screen.py b/screen.py
new file mode 100644
index 0000000..dfd4f6d
--- /dev/null
+++ b/screen.py
@@ -0,0 +1,119 @@
+from ctypes import *
+
+class pipe_screen(Structure):
+ pass
+
+pipe_screen._fields_ = [
+ ("winsys", c_void_p),
+ ("destroy", CFUNCTYPE(None, POINTER(pipe_screen))),
+ ("get_name", CFUNCTYPE(c_char_p, POINTER(pipe_screen))),
+ ("get_vendor", CFUNCTYPE(c_char_p, POINTER(pipe_screen))),
+ ("get_param", CFUNCTYPE(c_int, POINTER(pipe_screen), c_int)),
+ ("get_paramf", CFUNCTYPE(c_float, POINTER(pipe_screen), c_int)),
+ ("context_create", CFUNCTYPE(c_void_p, POINTER(pipe_screen), c_void_p)),
+ ("is_format_supported",
+ CFUNCTYPE(c_int,
+ POINTER(pipe_screen),
+ c_int,
+ c_int,
+ c_uint,
+ c_uint)),
+ ("resource_create", CFUNCTYPE(c_void_p, POINTER(pipe_screen), c_void_p)),
+ ("resource_from_handle",
+ CFUNCTYPE(c_void_p, POINTER(pipe_screen), c_void_p, c_void_p)),
+ ("resource_get_handle",
+ CFUNCTYPE(c_int, POINTER(pipe_screen), c_void_p, c_void_p)),
+ ("resource_destroy", CFUNCTYPE(None, POINTER(pipe_screen), c_void_p)),
+ ("get_tex_surface",
+ CFUNCTYPE(c_void_p,
+ POINTER(pipe_screen),
+ c_void_p,
+ c_uint,
+ c_uint,
+ c_uint,
+ c_uint)),
+ ("tex_surface_destroy", CFUNCTYPE(None, c_void_p)),
+ ("user_buffer_create",
+ CFUNCTYPE(c_void_p, POINTER(pipe_screen), c_void_p, c_uint, c_uint)),
+ ("flush_frontbuffer",
+ CFUNCTYPE(None, POINTER(pipe_screen), c_void_p, c_void_p)),
+ ("fence_reference",
+ CFUNCTYPE(None, POINTER(pipe_screen), c_void_p, c_void_p)),
+ ("fence_signalled",
+ CFUNCTYPE(c_int, POINTER(pipe_screen), c_void_p, c_uint)),
+ ("fence_finish",
+ CFUNCTYPE(c_int, POINTER(pipe_screen), c_void_p, c_uint)),
+]
+
+params = {
+ "MAX_TEXTURE_IMAGE_UNITS": 1,
+ "NPOT_TEXTURES": 2,
+ "TWO_SIDED_STENCIL": 3,
+ "GLSL": 4,
+ "DUAL_SOURCE_BLEND": 5,
+ "ANISOTROPIC_FILTER": 6,
+ "POINT_SPRITE": 7,
+ "MAX_RENDER_TARGETS": 8,
+ "OCCLUSION_QUERY": 9,
+ "TEXTURE_SHADOW_MAP": 10,
+ "MAX_TEXTURE_2D_LEVELS": 11,
+ "MAX_TEXTURE_3D_LEVELS": 12,
+ "MAX_TEXTURE_CUBE_LEVELS": 13,
+ "MAX_LINE_WIDTH": 14,
+ "MAX_LINE_WIDTH_AA": 15,
+ "MAX_POINT_WIDTH": 16,
+ "MAX_POINT_WIDTH_AA": 17,
+ "MAX_TEXTURE_ANISOTROPY": 18,
+ "MAX_TEXTURE_LOD_BIAS": 19,
+ "GUARD_BAND_LEFT": 20,
+ "GUARD_BAND_TOP": 21,
+ "GUARD_BAND_RIGHT": 22,
+ "GUARD_BAND_BOTTOM": 23,
+ "TEXTURE_MIRROR_CLAMP": 24,
+ "TEXTURE_MIRROR_REPEAT": 25,
+ "MAX_VERTEX_TEXTURE_UNITS": 26,
+ "TGSI_CONT_SUPPORTED": 27,
+ "BLEND_EQUATION_SEPARATE": 28,
+ "SM3": 29,
+ "MAX_PREDICATE_REGISTERS": 30,
+ "PIPE_CAP_MAX_COMBINED_SAMPLERS": 31,
+ "PIPE_CAP_MAX_CONST_BUFFERS": 32,
+ "PIPE_CAP_MAX_CONST_BUFFER_SIZE": 33,
+ "PIPE_CAP_INDEP_BLEND_ENABLE": 34,
+ "PIPE_CAP_INDEP_BLEND_FUNC": 35,
+ "PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT": 36,
+ "PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT": 37,
+ "PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER": 38,
+ "PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER": 39,
+}
+
+paramfs = {
+}
+
+class Screen(object):
+
+ def __init__(self, s):
+ self.pipe_screen = s
+
+ def __del__(self):
+ self.destroy()
+
+ def __getitem__(self, key):
+ if key in params:
+ return self.pipe_screen[0].get_param(self.pipe_screen, params[key])
+ elif key in paramfs:
+ return self.pipe_screen[0].get_paramf(self.pipe_screen, paramfs[key])
+ else:
+ raise KeyError
+
+ def destroy(self):
+ self.pipe_screen[0].destroy(self.pipe_screen)
+
+ @property
+ def name(self):
+ return self.pipe_screen[0].get_name(self.pipe_screen)
+
+ @property
+ def vendor(self):
+ return self.pipe_screen[0].get_vendor(self.pipe_screen)
+