bool Initialize() { gbm_ = gbm_create_device(drm_->GetFD()); if (!gbm_) { fprintf(stderr, "cannot create gbm device.\n"); return false; } if (!InitializeEGL()) { fprintf(stderr, "cannot create EGL context.\n"); return false; } DRMModesetter::Size display_size = drm_->GetDisplaySize(); for (auto& framebuffer : framebuffers_) { if (!CreateFramebuffer(display_size.width, display_size.height, framebuffer)) { fprintf(stderr, "cannot create framebuffer.\n"); return false; } } // Need to do the first mode setting before page flip. if (!drm_->ModeSetCrtc()) return false; return true; }
void Camera::SetRendermode(RenderMode mode) { int w = m_nScreenW; int h = m_nScreenH; Destroy(); if (mode == COLOR_DEPTH) CreateRenderTarget(w, h); CreateDepthTarget(w, h); CreateFramebuffer(); CreateRenderVBO(); UpdateRenderVBO(); m_eRenderMode = mode; }
Camera::Camera(int w, int h, RenderMode mode, float fov, float aspect, float _near, float _far) { m_nScreenW = w; m_nScreenH = h; int u2 = 1; int v2 = 1; while(u2 < w) u2 *= 2; while(v2 < h) v2 *= 2; w = u2; h = v2; m_nNearPlane = _near; m_nFarPlane = _far; m_nIsDepthUniform = 0; m_nClipPlanesUniform = 0; m_nBlitShader = 0; m_nUvAttrib = 0; m_nMVPUniform = 0; m_nPositionAttrib = 0; m_nTextureUniform = 0; m_nScaleUniform = 0; m_nScreenSpaceVBO = 0; InitBlitShader(); m_pRenderTarget = 0; m_pDepthTarget = 0; m_nFramebufferId = 0; m_nVBO = 0; m_eRenderMode = mode; if (mode == COLOR_DEPTH) CreateRenderTarget(w, h); CreateDepthTarget(w, h); CreateFramebuffer(); CreateRenderVBO(); m_vecPosition = glm::vec3(0.0f, 0.0f, 0.0f); m_quatRotation = glm::quat(); m_matView = glm::mat4(); m_matProj = glm::perspective(fov, aspect, _near, _far); UpdateRenderVBO(); }
void Camera::UpdateFrameBuffer(int screenW, int screenH) { m_nScreenW = screenW; m_nScreenH = screenH; int u2 = 1; int v2 = 1; while(u2 < screenW) u2 *= 2; while(v2 < screenH) v2 *= 2; screenW = u2; screenH = v2; Destroy(); if (m_eRenderMode == COLOR_DEPTH) CreateRenderTarget(screenW, screenH); CreateDepthTarget(screenW, screenH); CreateFramebuffer(); CreateRenderVBO(); UpdateRenderVBO(); }
int AttachDisplay(HDISPLAY handle) { RETURN_IF_NULL(handle); if (!IsDisplayConnected(handle)) { return 0; } if (IsDisplayAttached(handle)) { return 1; } if (handle->mod_count <= 0) { return 0; } unsigned int crtc = 0; if ((crtc = GetUnattachedCrtc(handle->device)) <= 0) { return 0; } unsigned int fbo = 0; if ((fbo = CreateFramebuffer(handle, 32)) <= 0) { return 0; } struct drm_mode_crtc req; memset(&req, 0, sizeof(req)); req.set_connectors_ptr = U64PTR(&handle->id); req.count_connectors = 1; req.mode_valid = 1; req.crtc_id = crtc; req.fb_id = fbo; memcpy(&req.mode, &handle->modes[0], sizeof(struct drm_mode_modeinfo)); if (ioctl(handle->fd, DRM_IOCTL_MODE_SETCRTC, &req)) { printf("err: %d\n", errno); return 0; } handle->crtc = crtc; return 1; }