drm: store KMS props in a map
This commit is contained in:
parent
47fed361cd
commit
706bdf849e
2 changed files with 45 additions and 49 deletions
84
src/drm.cpp
84
src/drm.cpp
|
@ -312,7 +312,7 @@ void flip_handler_thread_run(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool get_properties(struct drm_t *drm, uint32_t obj_id, uint32_t obj_type, drmModeObjectProperties **props_ptr, drmModePropertyRes ***props_info_ptr)
|
static bool get_properties(struct drm_t *drm, uint32_t obj_id, uint32_t obj_type, std::map<std::string, drmModePropertyRes *> &map)
|
||||||
{
|
{
|
||||||
drmModeObjectProperties *props = drmModeObjectGetProperties(drm->fd, obj_id, obj_type);
|
drmModeObjectProperties *props = drmModeObjectGetProperties(drm->fd, obj_id, obj_type);
|
||||||
if (!props) {
|
if (!props) {
|
||||||
|
@ -320,17 +320,18 @@ static bool get_properties(struct drm_t *drm, uint32_t obj_id, uint32_t obj_type
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
drmModePropertyRes **props_info = (drmModePropertyRes **)calloc(props->count_props, sizeof(drmModePropertyRes *));
|
map = {};
|
||||||
|
|
||||||
for (uint32_t i = 0; i < props->count_props; i++) {
|
for (uint32_t i = 0; i < props->count_props; i++) {
|
||||||
props_info[i] = drmModeGetProperty(drm->fd, props->props[i]);
|
drmModePropertyRes *prop = drmModeGetProperty(drm->fd, props->props[i]);
|
||||||
if (!props_info[i]) {
|
if (!prop) {
|
||||||
perror("drmModeGetProperty failed");
|
perror("drmModeGetProperty failed");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
map[prop->name] = prop;
|
||||||
}
|
}
|
||||||
|
|
||||||
*props_ptr = props;
|
drmModeFreeObjectProperties(props);
|
||||||
*props_info_ptr = props_info;
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -496,13 +497,13 @@ int init_drm(struct drm_t *drm, const char *device, const char *mode_str, unsign
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!get_properties(drm, drm->plane_id, DRM_MODE_OBJECT_PLANE, &drm->plane->props, &drm->plane->props_info)) {
|
if (!get_properties(drm, drm->plane_id, DRM_MODE_OBJECT_PLANE, drm->plane->props)) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (!get_properties(drm, drm->crtc_id, DRM_MODE_OBJECT_CRTC, &drm->crtc->props, &drm->crtc->props_info)) {
|
if (!get_properties(drm, drm->crtc_id, DRM_MODE_OBJECT_CRTC, drm->crtc->props)) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (!get_properties(drm, drm->connector_id, DRM_MODE_OBJECT_CONNECTOR, &drm->connector->props, &drm->connector->props_info)) {
|
if (!get_properties(drm, drm->connector_id, DRM_MODE_OBJECT_CONNECTOR, drm->connector->props)) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -550,22 +551,21 @@ static int add_connector_property(struct drm_t *drm, drmModeAtomicReq *req,
|
||||||
uint64_t value)
|
uint64_t value)
|
||||||
{
|
{
|
||||||
struct connector *obj = drm->connector;
|
struct connector *obj = drm->connector;
|
||||||
unsigned int i;
|
|
||||||
int prop_id = -1;
|
|
||||||
|
|
||||||
for (i = 0 ; i < obj->props->count_props ; i++) {
|
if ( obj->props.count( name ) == 0 )
|
||||||
if (strcmp(obj->props_info[i]->name, name) == 0) {
|
{
|
||||||
prop_id = obj->props_info[i]->prop_id;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (prop_id < 0) {
|
|
||||||
fprintf(stderr, "no connector property: %s\n", name);
|
fprintf(stderr, "no connector property: %s\n", name);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return drmModeAtomicAddProperty(req, obj_id, prop_id, value);
|
const drmModePropertyRes *prop = obj->props[ name ];
|
||||||
|
|
||||||
|
int ret = drmModeAtomicAddProperty(req, obj_id, prop->prop_id, value);
|
||||||
|
if ( ret < 0 )
|
||||||
|
{
|
||||||
|
perror( "drmModeAtomicAddProperty failed" );
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int add_crtc_property(struct drm_t *drm, drmModeAtomicReq *req,
|
static int add_crtc_property(struct drm_t *drm, drmModeAtomicReq *req,
|
||||||
|
@ -573,44 +573,42 @@ static int add_crtc_property(struct drm_t *drm, drmModeAtomicReq *req,
|
||||||
uint64_t value)
|
uint64_t value)
|
||||||
{
|
{
|
||||||
struct crtc *obj = drm->crtc;
|
struct crtc *obj = drm->crtc;
|
||||||
unsigned int i;
|
|
||||||
int prop_id = -1;
|
|
||||||
|
|
||||||
for (i = 0 ; i < obj->props->count_props ; i++) {
|
if ( obj->props.count( name ) == 0 )
|
||||||
if (strcmp(obj->props_info[i]->name, name) == 0) {
|
{
|
||||||
prop_id = obj->props_info[i]->prop_id;
|
fprintf(stderr, "no CRTC property: %s\n", name);
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (prop_id < 0) {
|
|
||||||
fprintf(stderr, "no crtc property: %s\n", name);
|
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return drmModeAtomicAddProperty(req, obj_id, prop_id, value);
|
const drmModePropertyRes *prop = obj->props[ name ];
|
||||||
|
|
||||||
|
int ret = drmModeAtomicAddProperty(req, obj_id, prop->prop_id, value);
|
||||||
|
if ( ret < 0 )
|
||||||
|
{
|
||||||
|
perror( "drmModeAtomicAddProperty failed" );
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int add_plane_property(struct drm_t *drm, drmModeAtomicReq *req,
|
static int add_plane_property(struct drm_t *drm, drmModeAtomicReq *req,
|
||||||
uint32_t obj_id, const char *name, uint64_t value)
|
uint32_t obj_id, const char *name, uint64_t value)
|
||||||
{
|
{
|
||||||
struct plane *obj = drm->plane;
|
struct plane *obj = drm->plane;
|
||||||
unsigned int i;
|
|
||||||
int prop_id = -1;
|
|
||||||
|
|
||||||
for (i = 0 ; i < obj->props->count_props ; i++) {
|
if ( obj->props.count( name ) == 0 )
|
||||||
if (strcmp(obj->props_info[i]->name, name) == 0) {
|
{
|
||||||
prop_id = obj->props_info[i]->prop_id;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (prop_id < 0) {
|
|
||||||
fprintf(stderr, "no plane property: %s\n", name);
|
fprintf(stderr, "no plane property: %s\n", name);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return drmModeAtomicAddProperty(req, obj_id, prop_id, value);
|
const drmModePropertyRes *prop = obj->props[ name ];
|
||||||
|
|
||||||
|
int ret = drmModeAtomicAddProperty(req, obj_id, prop->prop_id, value);
|
||||||
|
if ( ret < 0 )
|
||||||
|
{
|
||||||
|
perror( "drmModeAtomicAddProperty failed" );
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int drm_atomic_commit(struct drm_t *drm, struct Composite_t *pComposite, struct VulkanPipeline_t *pPipeline )
|
int drm_atomic_commit(struct drm_t *drm, struct Composite_t *pComposite, struct VulkanPipeline_t *pPipeline )
|
||||||
|
|
10
src/drm.hpp
10
src/drm.hpp
|
@ -18,25 +18,23 @@ extern "C" {
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
|
#include <map>
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
struct plane {
|
struct plane {
|
||||||
drmModePlane *plane;
|
drmModePlane *plane;
|
||||||
drmModeObjectProperties *props;
|
std::map<std::string, drmModePropertyRes *> props;
|
||||||
drmModePropertyRes **props_info;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct crtc {
|
struct crtc {
|
||||||
drmModeCrtc *crtc;
|
drmModeCrtc *crtc;
|
||||||
drmModeObjectProperties *props;
|
std::map<std::string, drmModePropertyRes *> props;
|
||||||
drmModePropertyRes **props_info;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct connector {
|
struct connector {
|
||||||
drmModeConnector *connector;
|
drmModeConnector *connector;
|
||||||
drmModeObjectProperties *props;
|
std::map<std::string, drmModePropertyRes *> props;
|
||||||
drmModePropertyRes **props_info;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct fb {
|
struct fb {
|
||||||
|
|
Loading…
Reference in a new issue