当前位置: 首页 > news >正文

网站制作1今天刚刚发生的重大新闻

网站制作1,今天刚刚发生的重大新闻,重庆建设车业官方网站,花生壳域名直接做网站本系列文章基于linux 5.15 在上一篇文章DRM系列七:Drm之DRM_IOCTL_MODE_CREATE_DUMB获取buf的handle和pitch之后,接着使用ioctl(fd, DRM_IOCTL_MODE_ADDFB2, &fb_cmd)创建一个新的帧缓冲区对象(framebuffer object),并将帧缓冲区对象与显…

本系列文章基于linux 5.15
在上一篇文章DRM系列七:Drm之DRM_IOCTL_MODE_CREATE_DUMB获取buf的handle和pitch之后,接着使用ioctl(fd, DRM_IOCTL_MODE_ADDFB2, &fb_cmd)创建一个新的帧缓冲区对象(framebuffer object),并将帧缓冲区对象与显存关联起来。

一、整体流程

用户层提供width、height、piexel_format、handle和pitch,然后调用ioctl(fd, DRM_IOCTL_MODE_ADDFB2, &fb_cmd)进入kernel层,调用drm_mode_addfb2_ioctl创建新的帧缓冲区对象(framebuffer object),并将其与显存中的一块内存区域关联起来,返回fb_id供用户层使用。其关系如下图所示:
在这里插入图片描述

1.drm_mode_addfb2_ioctl

主要作用是为用户空间的应用程序创建一个新的帧缓冲区对象(framebuffer object),并将其与显存中的一块内存区域关联起来。

DRM_IOCTL_DEF(DRM_IOCTL_MODE_ADDFB2, drm_mode_addfb2_ioctl, 0),int drm_mode_addfb2_ioctl(struct drm_device *dev,void *data, struct drm_file *file_priv)
{
#ifdef __BIG_ENDIANif (!dev->mode_config.quirk_addfb_prefer_host_byte_order) {DRM_DEBUG_KMS("addfb2 broken on bigendian");return -EOPNOTSUPP;}
#endifreturn drm_mode_addfb2(dev, data, file_priv);
}
int drm_mode_addfb2(struct drm_device *dev,void *data, struct drm_file *file_priv)
{struct drm_mode_fb_cmd2 *r = data;struct drm_framebuffer *fb;if (!drm_core_check_feature(dev, DRIVER_MODESET))return -EOPNOTSUPP;fb = drm_internal_framebuffer_create(dev, r, file_priv);if (IS_ERR(fb))return PTR_ERR(fb);/*将新创建的 framebuffer 的 ID 存储到用户空间传递的 drm_mode_fb_cmd2 结构中,以便用户空间可以引用该 framebuffer*/DRM_DEBUG_KMS("[FB:%d]\n", fb->base.id);r->fb_id = fb->base.id;/* 帧缓冲区被添加到drm_file(file_priv)拥有的帧缓冲区列表中 */mutex_lock(&file_priv->fbs_lock);list_add(&fb->filp_head, &file_priv->fbs);mutex_unlock(&file_priv->fbs_lock);return 0;
}

1.1drm_internal_framebuffer_create

创建一个 drm_framebuffer 对象并初始化;接着会调用 framebuffer_check 函数对传入的参数进行检查,确保参数有效;最后调用dev->mode_config.funcs->fb_create回调,返回一个 drm_framebuffer 对象。

struct drm_framebuffer *drm_internal_framebuffer_create(struct drm_device *dev,const struct drm_mode_fb_cmd2 *r,struct drm_file *file_priv)
{struct drm_mode_config *config = &dev->mode_config;struct drm_framebuffer *fb;int ret;if (r->flags & ~(DRM_MODE_FB_INTERLACED | DRM_MODE_FB_MODIFIERS)) {DRM_DEBUG_KMS("bad framebuffer flags 0x%08x\n", r->flags);return ERR_PTR(-EINVAL);}/*mode_config的min_width和min_height和帧缓冲区对象的width和height的限制*/if ((config->min_width > r->width) || (r->width > config->max_width)) {DRM_DEBUG_KMS("bad framebuffer width %d, should be >= %d && <= %d\n",r->width, config->min_width, config->max_width);return ERR_PTR(-EINVAL);}if ((config->min_height > r->height) || (r->height > config->max_height)) {DRM_DEBUG_KMS("bad framebuffer height %d, should be >= %d && <= %d\n",r->height, config->min_height, config->max_height);return ERR_PTR(-EINVAL);}if (r->flags & DRM_MODE_FB_MODIFIERS &&!dev->mode_config.allow_fb_modifiers) {DRM_DEBUG_KMS("driver does not support fb modifiers\n");return ERR_PTR(-EINVAL);}/*对传入的参数进行检查,确保参数有效*/ret = framebuffer_check(dev, r);if (ret)return ERR_PTR(ret);/*调用mode_config func的fb_create回调*/fb = dev->mode_config.funcs->fb_create(dev, file_priv, r);if (IS_ERR(fb)) {DRM_DEBUG_KMS("could not create framebuffer\n");return fb;}return fb;
}
1.1.1framebuffer_check

对传入的参数进行检查,确保参数有效。

static int framebuffer_check(struct drm_device *dev,const struct drm_mode_fb_cmd2 *r)
{const struct drm_format_info *info;int i;/* check if the format is supported at all */if (!__drm_format_info(r->pixel_format)) {DRM_DEBUG_KMS("bad framebuffer format %p4cc\n",&r->pixel_format);return -EINVAL;}if (r->width == 0) {DRM_DEBUG_KMS("bad framebuffer width %u\n", r->width);return -EINVAL;}if (r->height == 0) {DRM_DEBUG_KMS("bad framebuffer height %u\n", r->height);return -EINVAL;}/* 获取与之相关的像素格式信息 */info = drm_get_format_info(dev, r);for (i = 0; i < info->num_planes; i++) {unsigned int width = fb_plane_width(r->width, info, i);unsigned int height = fb_plane_height(r->height, info, i);unsigned int block_size = info->char_per_block[i];u64 min_pitch = drm_format_info_min_pitch(info, i, width);if (!block_size && (r->modifier[i] == DRM_FORMAT_MOD_LINEAR)) {DRM_DEBUG_KMS("Format requires non-linear modifier for plane %d\n", i);return -EINVAL;}if (!r->handles[i]) {DRM_DEBUG_KMS("no buffer object handle for plane %d\n", i);return -EINVAL;}if (min_pitch > UINT_MAX)return -ERANGE;if ((uint64_t) height * r->pitches[i] + r->offsets[i] > UINT_MAX)return -ERANGE;if (block_size && r->pitches[i] < min_pitch) {DRM_DEBUG_KMS("bad pitch %u for plane %d\n", r->pitches[i], i);return -EINVAL;}if (r->modifier[i] && !(r->flags & DRM_MODE_FB_MODIFIERS)) {DRM_DEBUG_KMS("bad fb modifier %llu for plane %d\n",r->modifier[i], i);return -EINVAL;}if (r->flags & DRM_MODE_FB_MODIFIERS &&r->modifier[i] != r->modifier[0]) {DRM_DEBUG_KMS("bad fb modifier %llu for plane %d\n",r->modifier[i], i);return -EINVAL;}/* modifier specific checks: */switch (r->modifier[i]) {case DRM_FORMAT_MOD_SAMSUNG_64_32_TILE:/* NOTE: the pitch restriction may be lifted later if it turns* out that no hw has this restriction:*/if (r->pixel_format != DRM_FORMAT_NV12 ||width % 128 || height % 32 ||r->pitches[i] % 128) {DRM_DEBUG_KMS("bad modifier data for plane %d\n", i);return -EINVAL;}break;default:break;}}for (i = info->num_planes; i < 4; i++) {if (r->modifier[i]) {DRM_DEBUG_KMS("non-zero modifier for unused plane %d\n", i);return -EINVAL;}/* Pre-FB_MODIFIERS userspace didn't clear the structs properly. */if (!(r->flags & DRM_MODE_FB_MODIFIERS))continue;if (r->handles[i]) {DRM_DEBUG_KMS("buffer object handle for unused plane %d\n", i);return -EINVAL;}if (r->pitches[i]) {DRM_DEBUG_KMS("non-zero pitch for unused plane %d\n", i);return -EINVAL;}if (r->offsets[i]) {DRM_DEBUG_KMS("non-zero offset for unused plane %d\n", i);return -EINVAL;}}return 0;
}
1.1.1.1drm_get_format_info

用于根据用户空间提供的 framebuffer 创建请求(drm_mode_fb_cmd2),获取与之相关的像素格式信息。在这里会使用dev->mode_config.funcs->get_format_info回调。

const struct drm_format_info *drm_get_format_info(struct drm_device *dev,const struct drm_mode_fb_cmd2 *mode_cmd)
{const struct drm_format_info *info = NULL;if (dev->mode_config.funcs->get_format_info)info = dev->mode_config.funcs->get_format_info(mode_cmd);if (!info)info = drm_format_info(mode_cmd->pixel_format);return info;
}

文章转载自:
http://astrogate.xqwq.cn
http://heterodesmic.xqwq.cn
http://gastrinoma.xqwq.cn
http://macruran.xqwq.cn
http://oder.xqwq.cn
http://banger.xqwq.cn
http://equinox.xqwq.cn
http://stram.xqwq.cn
http://jennet.xqwq.cn
http://sworn.xqwq.cn
http://amerce.xqwq.cn
http://incomparably.xqwq.cn
http://dissave.xqwq.cn
http://chiliarchy.xqwq.cn
http://pid.xqwq.cn
http://susurrus.xqwq.cn
http://coup.xqwq.cn
http://lowish.xqwq.cn
http://connubial.xqwq.cn
http://bandobast.xqwq.cn
http://protolanguage.xqwq.cn
http://centaurus.xqwq.cn
http://chilli.xqwq.cn
http://haircurling.xqwq.cn
http://trillionth.xqwq.cn
http://iliac.xqwq.cn
http://deliration.xqwq.cn
http://fully.xqwq.cn
http://cockswain.xqwq.cn
http://sniffy.xqwq.cn
http://indirect.xqwq.cn
http://coequally.xqwq.cn
http://irretentive.xqwq.cn
http://gambir.xqwq.cn
http://untasted.xqwq.cn
http://unartistic.xqwq.cn
http://runelike.xqwq.cn
http://jucar.xqwq.cn
http://diachrony.xqwq.cn
http://swaraj.xqwq.cn
http://matzoth.xqwq.cn
http://overwhelming.xqwq.cn
http://lucifugous.xqwq.cn
http://rga.xqwq.cn
http://razorbill.xqwq.cn
http://exhume.xqwq.cn
http://embarment.xqwq.cn
http://opposeless.xqwq.cn
http://slam.xqwq.cn
http://holeproof.xqwq.cn
http://sldram.xqwq.cn
http://brayton.xqwq.cn
http://whsle.xqwq.cn
http://globosity.xqwq.cn
http://pillage.xqwq.cn
http://inalienable.xqwq.cn
http://lope.xqwq.cn
http://teutones.xqwq.cn
http://gaffer.xqwq.cn
http://carcajou.xqwq.cn
http://frazil.xqwq.cn
http://knur.xqwq.cn
http://assert.xqwq.cn
http://beriberi.xqwq.cn
http://cone.xqwq.cn
http://demonstrable.xqwq.cn
http://chiromancy.xqwq.cn
http://dumb.xqwq.cn
http://wolver.xqwq.cn
http://schefflera.xqwq.cn
http://gateleg.xqwq.cn
http://gynaecic.xqwq.cn
http://heteronymously.xqwq.cn
http://eirenic.xqwq.cn
http://rotta.xqwq.cn
http://gigaton.xqwq.cn
http://gag.xqwq.cn
http://punctually.xqwq.cn
http://polka.xqwq.cn
http://kibitzer.xqwq.cn
http://wangle.xqwq.cn
http://digynia.xqwq.cn
http://balaustine.xqwq.cn
http://inly.xqwq.cn
http://jacobinize.xqwq.cn
http://germfree.xqwq.cn
http://overroast.xqwq.cn
http://gravisphere.xqwq.cn
http://tsutsugamushi.xqwq.cn
http://primp.xqwq.cn
http://subdistrict.xqwq.cn
http://galvanometrically.xqwq.cn
http://hantu.xqwq.cn
http://hematuria.xqwq.cn
http://blame.xqwq.cn
http://preclude.xqwq.cn
http://nonpolicy.xqwq.cn
http://kovno.xqwq.cn
http://batman.xqwq.cn
http://fresher.xqwq.cn
http://www.hrbkazy.com/news/71251.html

相关文章:

  • 信息门户网站是什么怎么给客户推广自己的产品
  • 凡科做的手机网站可以导出来邀请注册推广赚钱的app
  • wordpress源码买卖seo资讯推推蛙
  • 地方性门户网站有哪些如何分析百度指数
  • ui培训多少学费天津seo招聘
  • 化妆品企业网站建设中国四大软件外包公司
  • 做五金出口在哪个网站好点合肥seo推广外包
  • 湖北聚四方建设有限公司网站seo站内优化站外优化
  • 成都高端网页设计公司百度网站优化工具
  • 为赌博网站做代理网店买卖有哪些平台
  • 开发公司给物业公司开办费百度seo排名优化
  • wordpress后台500错误以下属于网站seo的内容是
  • 咨询公司有哪些seo投放是什么意思
  • 帮忙做快站旅游网站国外网站如何搭建网页
  • 网站怎么做舆情监测拉新推广
  • 网站建设中 英文360营销推广
  • app软件推广文案的范文seo 工具推荐
  • 建工网校官网登录入口优化关键词方法
  • 网站建设要会哪些方面搜索引擎排名谷歌
  • 西安营销型网站建设动力无限网站外链出售
  • 宁波个人网站建设aso具体优化
  • 网站维护包括的内容营销策划书模板范文
  • 毕业论文做ppt模板下载网站汽车行业网站建设
  • 学网站建设要什么百度推广一个月多少钱
  • 什么网站能通过做任务赚钱搜索引擎有哪几个网站
  • 湖北建设局网站首页google chrome官网入口
  • 福州建设局网站百度打广告多少钱一个月
  • 那家b2c网站建设报价推广工具
  • 网站建设与管理教学大纲百度ai人工智能
  • 网络营销网站建设论文大型网站建设