OSDN Git Service

NV50: switch to fixed point scale factor calculations
[android-x86/external-libdrm.git] / tests / mode / modetest.c
index bf1a516..bb91e83 100644 (file)
@@ -3,10 +3,13 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <stdint.h>
+#include <unistd.h>
+#include <string.h>
 
 #include "xf86drm.h"
 #include "xf86drmMode.h"
 
+int dpms_prop_id = 0;
 const char* getConnectionText(drmModeConnection conn)
 {
        switch (conn) {
@@ -20,20 +23,9 @@ const char* getConnectionText(drmModeConnection conn)
 
 }
 
-struct drm_mode_modeinfo* findMode(drmModeResPtr res, uint32_t id)
-{
-       int i;
-       for (i = 0; i < res->count_modes; i++) {
-               if (res->modes[i].id == id)
-                       return &res->modes[i];
-       }
-
-       return 0;
-}
-
 int printMode(struct drm_mode_modeinfo *mode)
 {
-#if 0
+#if 1
        printf("Mode: %s\n", mode->name);
        printf("\tclock       : %i\n", mode->clock);
        printf("\thdisplay    : %i\n", mode->hdisplay);
@@ -49,41 +41,101 @@ int printMode(struct drm_mode_modeinfo *mode)
        printf("\tvrefresh    : %i\n", mode->vrefresh);
        printf("\tflags       : %i\n", mode->flags);
 #else
-       printf("Mode: %i \"%s\" %ix%i %.0f\n", mode->id, mode->name,
+       printf("Mode: \"%s\" %ix%i %.0f\n", mode->name,
                mode->hdisplay, mode->vdisplay, mode->vrefresh / 1000.0);
 #endif
        return 0;
 }
 
-int printOutput(int fd, drmModeResPtr res, drmModeOutputPtr output, uint32_t id)
+int printConnector(int fd, drmModeResPtr res, drmModeConnectorPtr connector, uint32_t id)
 {
-       int i = 0;
+       int i = 0, j;
        struct drm_mode_modeinfo *mode = NULL;
+       drmModePropertyPtr props;
+       drmModeEncoderPtr enc;
+       unsigned char *name = NULL;
 
-       printf("Output: %s\n", output->name);
+       printf("Connector: %d-%d\n", connector->connector_type, connector->connector_type_id);
        printf("\tid           : %i\n", id);
-       printf("\tcrtc id      : %i\n", output->crtc);
-       printf("\tconn         : %s\n", getConnectionText(output->connection));
-       printf("\tsize         : %ix%i (mm)\n", output->mmWidth, output->mmHeight);
-       printf("\tcount_crtcs  : %i\n", output->count_crtcs);
-       printf("\tcrtcs        : %i\n", output->crtcs);
-       printf("\tcount_clones : %i\n", output->count_clones);
-       printf("\tclones       : %i\n", output->clones);
-       printf("\tcount_modes  : %i\n", output->count_modes);
-
-       for (i = 0; i < output->count_modes; i++) {
-               mode = findMode(res, output->modes[i]);
+       printf("\tencoder id      : %i\n", connector->encoder);
+       printf("\tconn         : %s\n", getConnectionText(connector->connection));
+       printf("\tsize         : %ix%i (mm)\n", connector->mmWidth, connector->mmHeight);
+       printf("\tcount_modes  : %i\n", connector->count_modes);
+       printf("\tcount_props  : %i\n", connector->count_props);
+       printf("\tcount_encs   : %i\n", connector->count_encoders);
+
+       for (i = 0; i < connector->count_encoders; i++) {
+               enc = drmModeGetEncoder(fd, connector->encoders[i]);
+               if (enc) {
+                       printf("Encoder: %d %d %d %d %d\n", enc->crtc, enc->encoder_id, enc->encoder_type, enc->crtcs, enc->clones);
+               }
+       }
 
+       for (i = 0; i < connector->count_props; i++) {
+               props = drmModeGetProperty(fd, connector->props[i]);
+               name = NULL;
+               if (props) {
+                       printf("Property: %s\n", props->name);
+                       printf("\tid:        %i\n", props->prop_id);
+                       printf("\tflags:     %i\n", props->flags);
+                       printf("\tvalues %d: ", props->count_values);
+                       for (j = 0; j < props->count_values; j++)
+                               printf("%lld ", props->values[j]);
+
+                       printf("\n\tenums %d: \n", props->count_enums);
+                       
+                       if (props->flags & DRM_MODE_PROP_BLOB) {
+                               drmModePropertyBlobPtr blob;
+
+                               blob = drmModeGetPropertyBlob(fd, connector->prop_values[i]);
+                               if (blob) {
+                                       printf("blob is %d length, %08X\n", blob->length, *(uint32_t *)blob->data);
+                                       drmModeFreePropertyBlob(blob);
+                               }
+
+                       } else {
+                               if (!strncmp(props->name, "DPMS", 4))
+                                       dpms_prop_id = props->prop_id;
+
+                               for (j = 0; j < props->count_enums; j++) {
+                                 printf("\t\t%lld = %s\n", props->enums[j].value, props->enums[j].name);
+                                       if (connector->prop_values[i] == props->enums[j].value)
+                                               name = props->enums[j].name;
+
+                               }
+
+                               if (props->count_enums && name) {
+                                       printf("\tconnector property name %s %s\n", props->name, name);
+                               } else {
+                                       printf("\tconnector property id %s %lli\n", props->name, connector->prop_values[i]);
+                               }
+                       }
+
+                       drmModeFreeProperty(props);
+               }
+       }
+
+       for (i = 0; i < connector->count_modes; i++) {
+               mode = &connector->modes[i];
                if (mode)
-                       printf("\t\tmode: %i \"%s\" %ix%i %.0f\n", mode->id, mode->name,
-                               mode->hdisplay, mode->vdisplay, mode->vrefresh / 1000.0);
+                       printMode(mode);
                else
-                       printf("\t\tmode: Invalid mode %i\n", output->modes[i]);
+                       printf("\t\tmode: Invalid mode %p\n", &connector->modes[i]);
        }
 
        return 0;
 }
 
+int printEncoder(int fd, drmModeResPtr res, drmModeEncoderPtr encoder, uint32_t id)
+{
+       printf("Encoder\n");
+       printf("\tid            :%i\n", id);
+       printf("\ttype          :%d\n", encoder->encoder_type);
+       printf("\tcrtcs          :%d\n", encoder->crtcs);
+       printf("\tclones          :%d\n", encoder->clones);
+       return 0;
+}
+
 int printCrtc(int fd, drmModeResPtr res, drmModeCrtcPtr crtc, uint32_t id)
 {
        printf("Crtc\n");
@@ -92,9 +144,10 @@ int printCrtc(int fd, drmModeResPtr res, drmModeCrtcPtr crtc, uint32_t id)
        printf("\ty            : %i\n", crtc->y);
        printf("\twidth        : %i\n", crtc->width);
        printf("\theight       : %i\n", crtc->height);
-       printf("\tmode         : %i\n", crtc->mode);
-       printf("\tnum outputs  : %i\n", crtc->count_outputs);
-       printf("\toutputs      : %i\n", crtc->outputs);
+       printf("\tmode         : %p\n", &crtc->mode);
+       printf("\tgamma size   : %d\n", crtc->gamma_size);
+       printf("\tnum connectors  : %i\n", crtc->count_connectors);
+       printf("\tconnectors      : %i\n", crtc->connectors);
        printf("\tnum possible : %i\n", crtc->count_possibles);
        printf("\tpossibles    : %i\n", crtc->possibles);
 
@@ -118,25 +171,34 @@ int printFrameBuffer(int fd, drmModeResPtr res, drmModeFBPtr fb)
 int printRes(int fd, drmModeResPtr res)
 {
        int i;
-       drmModeOutputPtr output;
+       drmModeConnectorPtr connector;
        drmModeCrtcPtr crtc;
        drmModeFBPtr fb;
+       drmModeEncoderPtr encoder;
 
-       for (i = 0; i < res->count_modes; i++) {
-               printMode(&res->modes[i]);
+       for (i = 0; i < res->count_connectors; i++) {
+               connector = drmModeGetConnector(fd, res->connectors[i]);
+
+               if (!connector)
+                       printf("Could not get connector %i\n", i);
+               else {
+                       printConnector(fd, res, connector, res->connectors[i]);
+                       drmModeFreeConnector(connector);
+               }
        }
 
-       for (i = 0; i < res->count_outputs; i++) {
-               output = drmModeGetOutput(fd, res->outputs[i]);
+       for (i = 0; i < res->count_encoders; i++) {
+               encoder = drmModeGetEncoder(fd, res->encoders[i]);
 
-               if (!output)
-                       printf("Could not get output %i\n", i);
+               if (!encoder)
+                       printf("Could not get encoder %i\n", i);
                else {
-                       printOutput(fd, res, output, res->outputs[i]);
-                       drmModeFreeOutput(output);
+                       printEncoder(fd, res, encoder, res->encoders[i]);
+                       drmModeFreeEncoder(encoder);
                }
        }
 
+
        for (i = 0; i < res->count_crtcs; i++) {
                crtc = drmModeGetCrtc(fd, res->crtcs[i]);
 
@@ -181,49 +243,35 @@ static struct drm_mode_modeinfo mode = {
 
 int testMode(int fd, drmModeResPtr res)
 {
-       uint32_t output = res->outputs[0];
+       uint32_t connector = res->connectors[0];
        uint32_t newMode = 0;
        int ret = 0;
        int error = 0;
 
-       printf("Test: adding mode to output %i\n", output);
+       printf("Test: adding mode to connector %i\n", connector);
 
        /* printMode(&mode); */
 
-       printf("\tAdding mode\n");
-       newMode = drmModeAddMode(fd, &mode);
-       if (!newMode)
-               goto err;
+       printf("\tAttaching mode %i to connector %i\n", newMode, connector);
 
-       printf("\tAttaching mode %i to output %i\n", newMode, output);
-
-       ret = drmModeAttachMode(fd, output, newMode);
+       ret = drmModeAttachMode(fd, connector, &mode);
 
        if (ret)
                goto err_mode;
 
-       printf("\tDetaching mode %i from output %i\n", newMode, output);
-       ret = drmModeDetachMode(fd, output, newMode);
+       printf("\tDetaching mode %i from connector %i\n", newMode, connector);
+       ret = drmModeDetachMode(fd, connector, &mode);
 
        if (ret)
                goto err_mode;
-
-       printf("\tRemoveing new mode %i\n", newMode);
-       ret = drmModeRmMode(fd, newMode);
-       if (ret)
-               goto err;
-
        return 0;
 
 err_mode:
-       error = drmModeRmMode(fd, newMode);
 
-err:
        printf("\tFailed\n");
 
        if (error)
                printf("\tFailed to delete mode %i\n", newMode);
-
        return 1;
 }
 
@@ -259,12 +307,20 @@ int testFrameBufferAdd(int fd, drmModeResPtr res)
        printf("\tCreating BO\n");
 
        /* TODO */
-       ret = 1;
+       ret = drmBOCreate(fd, 800 * 600 * 4, 0, 0,
+               DRM_BO_FLAG_READ |
+               DRM_BO_FLAG_WRITE |
+               DRM_BO_FLAG_MEM_TT |
+               DRM_BO_FLAG_MEM_VRAM |
+               DRM_BO_FLAG_NO_EVICT,
+               DRM_BO_HINT_DONT_FENCE, &bo);
+
+       printf("\tgot %i\n", ret);
        if (ret)
                goto err;
 
        printf("\tAdding FB\n");
-       ret = drmModeAddFB(fd, 640, 480, 32, 8, 0, &bo, &fb);
+       ret = drmModeAddFB(fd, 800, 600, 32, 8, 0, bo.handle, &fb);
        if (ret)
                goto err_bo;
 
@@ -288,12 +344,12 @@ int testFrameBufferAdd(int fd, drmModeResPtr res)
 
        printf("\tRemoveing BO\n");
 
-       ret = drmBODestroy(fb, &bo);
+       ret = drmBOUnreference(fb, &bo);
 
        return 0;
        
 err_bo:
-       drmBODestroy(fd, &bo);
+       drmBOUnreference(fd, &bo);
 
 err:
        printf("\tFailed\n");
@@ -301,19 +357,33 @@ err:
        return 1;
 }
 
+int testDPMS(int fd, drmModeResPtr res)
+{
+       int connector_id;
+       int i;
+
+       for (i = 0; i < res->count_connectors; i++) {
+               connector_id = res->connectors[i];
+               /* turn connector off */
+               drmModeConnectorSetProperty(fd, connector_id, dpms_prop_id, 3);
+               sleep(2);
+               drmModeConnectorSetProperty(fd, connector_id, dpms_prop_id, 0);
+       }
+       return 1;
+
+}
 
 int main(int argc, char **argv)
 {
        int fd;
-       const char *driver = "i915"; /* hardcoded for now */
        drmModeResPtr res;
 
        printf("Starting test\n");
 
-       fd = drmOpen(driver, NULL);
+       fd = drmOpen("i915", NULL);
 
        if (fd < 0) {
-               printf("Failed to open the card fb\n");
+               printf("Failed to open the card fb (%d)\n",fd);
                return 1;
        }
 
@@ -330,6 +400,8 @@ int main(int argc, char **argv)
 
        testFrameBufferAdd(fd, res);
 
+       /* try dpms test */
+       testDPMS(fd, res);
        drmModeFreeResources(res);
        printf("Ok\n");