/*! \internal Creates an in-memory, linear accessible surface of dimensions \a w * \a h. This is the main surface that QWS blits to. */ static inline bool createMemSurface(QQnxScreenContext * const d, int w, int h) { #ifndef QT_NO_QWS_MULTIPROCESS if (QApplication::type() != QApplication::GuiServer) { unsigned sidlist[64]; int n = gf_surface_sidlist(d->device, sidlist); // undocumented API for (int i = 0; i < n; ++i) { int ret = gf_surface_attach_by_sid(&d->memSurface, d->device, sidlist[i]); if (ret == GF_ERR_OK) { gf_surface_get_info(d->memSurface, &d->memSurfaceInfo); if (d->memSurfaceInfo.sid != unsigned(GF_SID_INVALID)) { // can we use the surface's vaddr? unsigned flags = GF_SURFACE_CPU_LINEAR_READABLE | GF_SURFACE_CPU_LINEAR_WRITEABLE; if ((d->memSurfaceInfo.flags & flags) == flags) return true; } gf_surface_free(d->memSurface); d->memSurface = 0; } } qWarning("QQnxScreen: cannot attach to an usable surface; create a new one."); } #endif int ret = gf_surface_create(&d->memSurface, d->device, w, h, d->displayInfo.format, 0, GF_SURFACE_CREATE_CPU_FAST_ACCESS | GF_SURFACE_CREATE_CPU_LINEAR_ACCESSIBLE | GF_SURFACE_CREATE_PHYS_CONTIG | GF_SURFACE_CREATE_SHAREABLE); if (ret != GF_ERR_OK) { qWarning("QQnxScreen: gf_surface_create(%dx%d) failed with error code %d", w, h, ret); return false; } gf_surface_get_info(d->memSurface, &d->memSurfaceInfo); if (d->memSurfaceInfo.sid == unsigned(GF_SID_INVALID)) { qWarning("QQnxScreen: gf_surface_get_info() failed."); return false; } return true; }
int gf_setup(gf_setup_t *setup, int argc, char * const argv[], unsigned flags) { gf_dev_t gdev; unsigned dispno = 0; const char *dev_name = NULL; int layer_idx = GF_SETUP_LAYER_MAIN, rc, verbose = 0; gf_sid_t sid = GF_SID_INVALID; unsigned vx1 = 0, vx2 = ~0, vy1 = 0, vy2 = ~0; memset(setup, 0, sizeof *setup); setup->fname = strdup("tt0419m_.ttf"); #ifdef _MSC_VER #else opterr = 0; while ((rc = getopt(argc, argv, "d:D:l:s:vx:y:f:")) != -1) { switch (rc) { case 'd': if (isdigit(*optarg)) { dev_name = GF_DEVICE_INDEX(atoi(optarg)); } else { dev_name = optarg; } break; case 'D': dispno = atoi(optarg); break; case 'l': layer_idx = atoi(optarg); break; case 's': sid = (gf_sid_t)atoi(optarg); break; case 'v': verbose = ~0; break; case 'x': switch (*optarg++) { case '1': vx1 = atoi(optarg); break; case '2': vx2 = atoi(optarg); break; default: break; } break; case 'y': switch (*optarg++) { case '1': vy1 = atoi(optarg); break; case '2': vy2 = atoi(optarg); break; default: break; } break; case 'f': setup->fname = strdup(optarg); break; default: break; } } #endif if ((rc = gf_dev_attach(&gdev, dev_name, NULL)) == GF_ERR_OK) { if (sid != GF_SID_INVALID) { gf_surface_t surface; if ((rc = gf_surface_attach_by_sid(&surface, gdev, sid)) == GF_ERR_OK) { gf_context_t context; if ((rc = gf_context_create(&context)) == GF_ERR_OK) { if ((rc = gf_context_set_surface(context, surface)) == GF_ERR_OK) { gf_surface_info_t sinfo; gf_surface_get_info(surface, &sinfo); --sinfo.w; --sinfo.h; if (vx2 > sinfo.w) { vx2 = sinfo.w; } if (vy2 > sinfo.h) { vy2 = sinfo.h; } if (vx1 <= vx2 && vy1 <= vy2 && (vx1 || vy1 || vx2 < sinfo.w || vy2 < sinfo.h)) { gf_context_set_clipping(context, vx1, vy1, vx2, vy2); setup->x1 = vx1; setup->x2 = vx2; setup->y1 = vy1; setup->y2 = vy2; } setup->surface1 = surface; setup->context = context; setup->gdev = gdev; return GF_ERR_OK; } gf_context_free(context); } gf_surface_free(surface); } } else { gf_display_t display; gf_display_info_t dinfo; if ((rc = gf_display_attach(&display, gdev, dispno, &dinfo)) == GF_ERR_OK) { gf_layer_t layer; if (verbose) { fprintf(stderr, "Display %d:\n\tResolution: %dX%d\n", dispno, dinfo.xres, dinfo.yres); fprintf(stderr, "\tRefresh rate: %d\n\tPixel format: ", dinfo.refresh); switch (dinfo.format) { case GF_FORMAT_PAL8: fprintf(stderr, "PAL8"); break; case GF_FORMAT_PACK_ARGB1555: fprintf(stderr, "ARGB1555"); break; case GF_FORMAT_PACK_RGB565: fprintf(stderr, "RGB565"); break; case GF_FORMAT_BGR888: fprintf(stderr, "BGR888"); break; case GF_FORMAT_BGRA8888: fprintf(stderr, "BGRA8888"); break; default: fprintf(stderr, "%x", (unsigned)dinfo.format); break; } fprintf(stderr, "\n\tNumber of layers: %d\n", dinfo.nlayers); fprintf(stderr, "\tMain layer index: %d\n", dinfo.main_layer_index); } if ((rc = gf_layer_attach(&layer, display, layer_idx == GF_SETUP_LAYER_MAIN ? dinfo.main_layer_index : layer_idx, 0)) == GF_ERR_OK) { gf_surface_t surface1, surface2 = NULL; int layer_format; layer_format = find_rgb_format(layer); if(verbose && layer_format != dinfo.format) { fprintf(stderr, "\tChoosing non-default layer format: "); switch (layer_format) { case GF_FORMAT_PAL8: fprintf(stderr, "PAL8"); break; case GF_FORMAT_PACK_ARGB1555: fprintf(stderr, "ARGB1555"); break; case GF_FORMAT_PACK_RGB565: fprintf(stderr, "RGB565"); break; case GF_FORMAT_BGR888: fprintf(stderr, "BGR888"); break; case GF_FORMAT_BGRA8888: fprintf(stderr, "BGRA8888"); break; default: fprintf(stderr, "%x", (unsigned)layer_format); break; } fprintf(stderr, "\n"); } dinfo.format = layer_format; if ((rc = gf_surface_create_layer(&surface1, &layer, 1, 0, dinfo.xres, dinfo.yres, dinfo.format, NULL, 0)) == GF_ERR_OK && (!(flags & GF_SETUP_FLAG_DBLBUFFER) || (rc = gf_surface_create_layer(&surface2, &layer, 1, 0, dinfo.xres, dinfo.yres, dinfo.format, NULL, 0)) == GF_ERR_OK)) { if (verbose) { gf_surface_info_t sinfo; gf_surface_get_info(surface1, &sinfo); fprintf(stderr, "Surface:\n\tSID = %d\n", (unsigned)sinfo.sid); fprintf(stderr, "\tFlags = %x\n", sinfo.flags); } gf_layer_set_surfaces(layer, &surface1, 1); if ((rc = gf_layer_update(layer, 0)) == GF_ERR_OK) { gf_context_t context = NULL; if ((flags & GF_SETUP_FLAG_NOCONTEXT) || ((rc = gf_context_create(&context)) == GF_ERR_OK && (rc = gf_context_set_surface(context, surface1)) == GF_ERR_OK)) { setup->gdev = gdev; setup->display = display; memcpy(&setup->display_info, &dinfo, sizeof dinfo); setup->layer = layer; setup->surface1 = surface1; setup->surface2 = surface2; setup->context = context; return GF_ERR_OK; } if (context != NULL) { gf_context_free(context); } } } } } } gf_dev_detach(gdev); } return rc; }