VaapiSurfaceGLXImpl::VaapiSurfaceGLXImpl(GLenum target, GLuint texture) : VaapiSurfaceImplBase(0, 0) { GNASH_REPORT_FUNCTION; reset(0); if (target == 0 || texture == 0) { return; } VaapiGlobalContext * gvactx = VaapiGlobalContext::get(); if (!gvactx) { return; } VAStatus status; void *surface = NULL; status = vaCreateSurfaceGLX(gvactx->display(), target, texture, &surface); if (!vaapi_check_status(status, "vaCreateSurfaceGLX()")) { return; } reset(reinterpret_cast<uintptr_t>(surface)); log_debug(_(" -> surface %p\n", this->surface())); }
void* VAAPIContext::GetGLXSurface(uint texture, uint texture_type) { if (m_dispType != kVADisplayGLX) return NULL; if (m_glxSurfaces.contains(texture)) return m_glxSurfaces.value(texture); MythXLocker locker(m_display->m_x_disp); void *glx_surface = NULL; INIT_ST; va_status = vaCreateSurfaceGLX(m_ctx.display, texture_type, texture, &glx_surface); CHECK_ST; if (!glx_surface) { LOG(VB_GENERAL, LOG_ERR, LOC + "Failed to create GLX surface."); return NULL; } m_glxSurfaces.insert(texture, glx_surface); LOG(VB_PLAYBACK, LOG_INFO, LOC + QString("Number of VAAPI GLX surfaces: %1") .arg(m_glxSurfaces.size())); return glx_surface; }
VaApiMixer::VaApiMixer(const QList<OpenGLTexture2D> &textures, const VideoFormat &/*format*/) { Q_ASSERT(textures.size() == 1); const auto &texture = textures.first(); texture.bind(); if (!check(vaCreateSurfaceGLX(VaApi::glx(), texture.target(), texture.id(), &m_glSurface), "Cannot create OpenGL surface.")) return; }
static int reinit(struct gl_hwdec *hw, int w, int h) { struct priv *p = hw->priv; GL *gl = hw->mpgl->gl; VAStatus status; destroy_texture(hw); gl->GenTextures(1, &p->gl_texture); gl->BindTexture(GL_TEXTURE_2D, p->gl_texture); gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); gl->TexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); gl->BindTexture(GL_TEXTURE_2D, 0); status = vaCreateSurfaceGLX(p->display, GL_TEXTURE_2D, p->gl_texture, &p->vaglx_surface); return check_va_status(status, "vaCreateSurfaceGLX()") ? 0 : -1; }
static int reinit(struct gl_hwdec *hw, const struct mp_image_params *params) { struct priv *p = hw->priv; GL *gl = hw->mpgl->gl; VAStatus status; destroy_texture(hw); gl->GenTextures(1, &p->gl_texture); gl->BindTexture(GL_TEXTURE_2D, p->gl_texture); gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); gl->TexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, params->w, params->h, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); gl->BindTexture(GL_TEXTURE_2D, 0); va_lock(p->ctx); status = vaCreateSurfaceGLX(p->display, GL_TEXTURE_2D, p->gl_texture, &p->vaglx_surface); va_unlock(p->ctx); return CHECK_VA_STATUS(p, "vaCreateSurfaceGLX()") ? 0 : -1; }