Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 6dca1f7

Browse files
committed
Add Chapter9
1 parent ac4db5f commit 6dca1f7

18 files changed

+3056
-3
lines changed

‎Chapter9/draw_color.c‎

Lines changed: 191 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,191 @@
1+
#include <stdio.h>
2+
#include <stdlib.h>
3+
#include <unistd.h>
4+
#include <fcntl.h>
5+
#include <gbm.h>
6+
#include <xf86drmMode.h>
7+
#include <GL/gl.h>
8+
#include <EGL/egl.h>
9+
10+
int main(int argc, char **argv)
11+
{
12+
int device = open("/dev/dri/card1", O_RDWR); /* DRI 장치 열기 */
13+
14+
/* EGL을 위한 변수 선언 */
15+
EGLDisplay gDisplay;
16+
EGLSurface gSurface;
17+
EGLContext gContext;
18+
EGLConfig gConfig, *gConfigs;
19+
EGLint cfgCnt, cfgIdx, count = 0, currFB;
20+
21+
/* eglChooseConfig() 함수에서 사용할 설정값 */
22+
static const EGLint attribute_list[] = {
23+
EGL_RED_SIZE, 8,
24+
EGL_GREEN_SIZE, 8,
25+
EGL_BLUE_SIZE, 8,
26+
EGL_ALPHA_SIZE, 0,
27+
EGL_DEPTH_SIZE, 24,
28+
EGL_NONE
29+
};
30+
31+
/* eglCreateContext() 함수에서 사용할 설정값 */
32+
static const EGLint context_attributes[] = {
33+
EGL_CONTEXT_CLIENT_VERSION, 1, /* OpenGL ES 1.x: 1, OpenGL ES 2: 2 */
34+
EGL_NONE
35+
};
36+
37+
/* DRM(Direct Rendering Manager) 초기화 */
38+
drmModeRes *resources = drmModeGetResources(device);
39+
drmModeConnector *connector = drmModeGetConnector(device,
40+
resources->connectors[0]);
41+
drmModeModeInfo modeInfo = connector->modes[0];
42+
43+
drmModeEncoder *encoder = drmModeGetEncoder(device, connector->encoder_id);
44+
drmModeCrtc *crtc = drmModeGetCrtc(device, encoder->crtc_id);
45+
uint32_t connector_id = connector->connector_id;
46+
47+
/* GBM(Generic Buffer Manager) 초기화 */
48+
struct gbm_device *gbmDev = gbm_create_device(device);
49+
struct gbm_surface *gbmSurface = gbm_surface_create(gbmDev,
50+
modeInfo.hdisplay, modeInfo.vdisplay,
51+
GBM_FORMAT_XRGB8888,
52+
GBM_BO_USE_SCANOUT | GBM_BO_USE_RENDERING);
53+
54+
/* EGL 초기화 */
55+
gDisplay = eglGetDisplay(gbmDev);
56+
eglInitialize(gDisplay, NULL, NULL);
57+
eglGetConfigs(gDisplay, NULL, 0, &count);
58+
eglBindAPI(EGL_OPENGL_API);
59+
gConfigs = malloc(count * sizeof *gConfigs);
60+
eglChooseConfig(gDisplay, attribute_list, gConfigs, count, &cfgCnt);
61+
62+
/* 현재 사용 가능한 채널 획득 */
63+
for(cfgIdx = 0; cfgIdx < cfgCnt; cfgIdx++) {
64+
EGLint id;
65+
if(!eglGetConfigAttrib(gDisplay, gConfigs[cfgIdx], EGL_NATIVE_VISUAL_ID, &id)) continue;
66+
if(id == GBM_FORMAT_XRGB8888) break;
67+
}
68+
69+
/* EGL 서피스 생성 */
70+
gContext = eglCreateContext(gDisplay, gConfigs[cfgIdx], EGL_NO_CONTEXT, context_attributes);
71+
gSurface = eglCreateWindowSurface(gDisplay, gConfigs[cfgIdx], gbmSurface, NULL);
72+
free(gConfigs);
73+
eglMakeCurrent(gDisplay, gSurface, gSurface, gContext);
74+
75+
/* EGL과 OpenGL 함수 수행 */
76+
/* 화면의 크기를 저장하기 위한 변수 */
77+
uint32_t screenWidth = modeInfo.hdisplay, screenHeight = modeInfo.vdisplay;
78+
79+
/* OpenGL에서 glClear() 함수로 버퍼를 지울 때의 색상을 설정 */
80+
glClearColor(0.15f, 0.25f, 0.35f, 1.0f);
81+
82+
/* 색상 버퍼 비트(GL_COLOR_BUFFER_BIT) 지우기 */
83+
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
84+
85+
/* 현재의 행렬 모드를 GL_PROJECTION로 설정 */
86+
glMatrixMode(GL_PROJECTION);
87+
glLoadIdentity();
88+
89+
/* 현재 윈도우에 OpenGL의 표시를 위한 영역 설정 */
90+
glViewport(0, 0, screenWidth, screenHeight);
91+
92+
/* 직교 투영으로 좌표계의 범위를 설정한다. */
93+
glOrtho(-1.778f, 1.778f, -1.0f, 1.0f, -10.0f, 10.0f);
94+
95+
glEnable(GL_DEPTH_TEST);
96+
97+
/* 현재의 행렬 모드를 GL_MODELVIEW로 설정 */
98+
glMatrixMode(GL_MODELVIEW);
99+
glLoadIdentity();
100+
glTranslatef(0.0f, 0.0f, 1.0f);
101+
glRotatef(45.0f, 1.0f, 1.0f, 1.0f);
102+
103+
/* 출력될 도형을 위한 좌표 설정 */
104+
GLfloat points[] = {
105+
-0.5f,-0.5f,-0.5f, /* 뒤좌하*/
106+
-0.5f, 0.5f,-0.5f, /* 뒤좌상 */
107+
0.5f, 0.5f,-0.5f, /* 뒤우상 */
108+
0.5f,-0.5f,-0.5f, /* 뒤우하 */
109+
-0.5f,-0.5f, 0.5f, /* 앞좌하 */
110+
-0.5f, 0.5f, 0.5f, /* 앞좌상 */
111+
0.5f, 0.5f, 0.5f, /* 앞우상 */
112+
0.5f,-0.5f, 0.5f /* 앞우하 */
113+
};
114+
115+
/* 12개의 삼각형을 위한 정점의 배열 인덱스 */
116+
GLubyte indices[] = {
117+
0,1,2, 0,2,3, /* 뒤면 */
118+
4,6,5, 4,7,6, /* 앞면 */
119+
0,4,5, 0,5,1, /* 좌면 */
120+
1,5,6, 1,6,2, /* 윗면 */
121+
2,6,7, 2,7,3, /* 우면 */
122+
3,7,4, 3,4,0 /* 하면 */
123+
};
124+
125+
/* 정점의 색상을 위한 배열 */
126+
GLfloat colors[] = {
127+
0.0f, 1.0f, 0.0f, 1.0f,
128+
0.0f, 1.0f, 0.0f, 1.0f,
129+
1.0f, 0.5f, 0.0f, 1.0f,
130+
1.0f, 0.5f, 0.0f, 1.0f,
131+
1.0f, 0.0f, 0.0f, 1.0f,
132+
1.0f, 0.0f, 0.0f, 1.0f,
133+
0.0f, 0.0f, 1.0f, 1.0f,
134+
1.0f, 0.0f, 1.0f, 1.0f
135+
};
136+
137+
/* 정점 배열 사용을 설정 */
138+
glEnableClientState(GL_VERTEX_ARRAY);
139+
140+
/* 색상 배열 사용을 설정 */
141+
glEnableClientState(GL_COLOR_ARRAY);
142+
143+
/* 그래픽 출력을 위한 정점 배열 사용에 대한 설정 */
144+
glVertexPointer(3, GL_FLOAT, 0, points);
145+
146+
/* 그래픽 출력을 위한 색상 배열 사용에 대한 설정 */
147+
glColorPointer(4, GL_FLOAT, 0, colors);
148+
149+
/* 삼각형 12개를 드로잉(6*2) : 처리할 정점의 수 : 36개 */
150+
glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_BYTE, indices);
151+
152+
/* 그래픽 출력을 하고 나서 색상 배열 사용에 대한 설정 해제 */
153+
glDisableClientState(GL_COLOR_ARRAY);
154+
155+
/* 그래픽 출력을 하고 나서 정점 배열 사용에 대한 설정 해제 */
156+
glDisableClientState(GL_VERTEX_ARRAY);
157+
158+
eglSwapBuffers(gDisplay, gSurface); /* OpenGL ES의 내용을 EGL로 출력 */
159+
160+
struct gbm_bo *currBo = gbm_surface_lock_front_buffer(gbmSurface);
161+
uint32_t handle = gbm_bo_get_handle(currBo).u32;
162+
uint32_t pitch = gbm_bo_get_stride(currBo);
163+
164+
drmModeAddFB(device, modeInfo.hdisplay, modeInfo.vdisplay, 24, 32, pitch, handle, &currFB);
165+
drmModeSetCrtc(device, crtc->crtc_id, currFB, 0, 0, &connector_id, 1, &modeInfo);
166+
167+
getchar();
168+
169+
/* DRM Crtc 원래 모드로 돌리기 */
170+
drmModeSetCrtc(device, crtc->crtc_id, crtc->buffer_id, crtc->x, crtc->y, &connector_id, 1, &crtc->mode);
171+
drmModeFreeCrtc(crtc);
172+
173+
/* 사용한 버퍼 해제 */
174+
if(currBo) {
175+
drmModeRmFB(device, currFB);
176+
gbm_surface_release_buffer(gbmSurface, currBo);
177+
}
178+
179+
/* GBM 장치 정리 */
180+
gbm_surface_destroy(gbmSurface);
181+
gbm_device_destroy(gbmDev);
182+
183+
/* DRM 장치 정리 */
184+
drmModeFreeConnector(connector);
185+
drmModeFreeResources(resources);
186+
187+
close(device);
188+
189+
return 0;
190+
}
191+

‎Chapter9/draw_cube.c‎

Lines changed: 168 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,168 @@
1+
#include <stdio.h>
2+
#include <stdlib.h>
3+
#include <unistd.h>
4+
#include <fcntl.h>
5+
#include <gbm.h>
6+
#include <xf86drmMode.h>
7+
#include <GL/gl.h>
8+
#include <EGL/egl.h>
9+
10+
int main(int argc, char **argv)
11+
{
12+
int device = open("/dev/dri/card1", O_RDWR); /* DRI 장치 열기 */
13+
14+
/* EGL을 위한 변수 선언 */
15+
EGLDisplay gDisplay;
16+
EGLSurface gSurface;
17+
EGLContext gContext;
18+
EGLConfig gConfig, *gConfigs;
19+
EGLint cfgCnt, cfgIdx, count = 0, currFB;
20+
21+
/* eglChooseConfig() 함수에서 사용할 설정값 */
22+
static const EGLint attribute_list[] = {
23+
EGL_RED_SIZE, 8,
24+
EGL_GREEN_SIZE, 8,
25+
EGL_BLUE_SIZE, 8,
26+
EGL_ALPHA_SIZE, 0,
27+
EGL_DEPTH_SIZE, 24,
28+
EGL_NONE
29+
};
30+
31+
/* eglCreateContext() 함수에서 사용할 설정값 */
32+
static const EGLint context_attributes[] = {
33+
EGL_CONTEXT_CLIENT_VERSION, 1, /* OpenGL ES 1.x: 1, OpenGL ES 2: 2 */
34+
EGL_NONE
35+
};
36+
37+
/* DRM(Direct Rendering Manager) 초기화 */
38+
drmModeRes *resources = drmModeGetResources(device);
39+
drmModeConnector *connector = drmModeGetConnector(device,
40+
resources->connectors[0]);
41+
drmModeModeInfo modeInfo = connector->modes[0];
42+
43+
drmModeEncoder *encoder = drmModeGetEncoder(device, connector->encoder_id);
44+
drmModeCrtc *crtc = drmModeGetCrtc(device, encoder->crtc_id);
45+
uint32_t connector_id = connector->connector_id;
46+
47+
/* GBM(Generic Buffer Manager) 초기화 */
48+
struct gbm_device *gbmDev = gbm_create_device(device);
49+
struct gbm_surface *gbmSurface = gbm_surface_create(gbmDev,
50+
modeInfo.hdisplay, modeInfo.vdisplay,
51+
GBM_FORMAT_XRGB8888,
52+
GBM_BO_USE_SCANOUT | GBM_BO_USE_RENDERING);
53+
54+
/* EGL 초기화 */
55+
gDisplay = eglGetDisplay(gbmDev);
56+
eglInitialize(gDisplay, NULL, NULL);
57+
eglGetConfigs(gDisplay, NULL, 0, &count);
58+
eglBindAPI(EGL_OPENGL_API);
59+
gConfigs = malloc(count * sizeof *gConfigs);
60+
eglChooseConfig(gDisplay, attribute_list, gConfigs, count, &cfgCnt);
61+
62+
/* 현재 사용 가능한 채널 획득 */
63+
for(cfgIdx = 0; cfgIdx < cfgCnt; cfgIdx++) {
64+
EGLint id;
65+
if(!eglGetConfigAttrib(gDisplay, gConfigs[cfgIdx], EGL_NATIVE_VISUAL_ID, &id)) continue;
66+
if(id == GBM_FORMAT_XRGB8888) break;
67+
}
68+
69+
/* EGL 서피스 생성 */
70+
gContext = eglCreateContext(gDisplay, gConfigs[cfgIdx], EGL_NO_CONTEXT, context_attributes);
71+
gSurface = eglCreateWindowSurface(gDisplay, gConfigs[cfgIdx], gbmSurface, NULL);
72+
free(gConfigs);
73+
eglMakeCurrent(gDisplay, gSurface, gSurface, gContext);
74+
75+
/* EGL과 OpenGL 함수 수행 */
76+
/* 화면의 크기를 저장하기 위한 변수 */
77+
uint32_t screenWidth = modeInfo.hdisplay, screenHeight = modeInfo.vdisplay;
78+
79+
/* OpenGL에서 glClear() 함수로 버퍼를 지울 때의 색상을 설정 */
80+
glClearColor(0.15f, 0.25f, 0.35f, 1.0f);
81+
82+
/* 색상 버퍼 비트(GL_COLOR_BUFFER_BIT) 지우기 */
83+
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
84+
85+
/* 현재의 행렬 모드를 GL_PROJECTION로 설정 */
86+
glMatrixMode(GL_PROJECTION);
87+
glLoadIdentity();
88+
89+
/* 현재 윈도우에 OpenGL의 표시를 위한 영역 설정 */
90+
glViewport(0, 0, screenWidth, screenHeight);
91+
92+
/* 직교 투영으로 좌표계의 범위를 설정한다. */
93+
glOrtho(-1.778f, 1.778f, -1.0f, 1.0f, -10.0f, 10.0f);
94+
95+
glEnable(GL_DEPTH_TEST);
96+
97+
/* 현재의 행렬 모드를 GL_MODELVIEW로 설정 */
98+
glMatrixMode(GL_MODELVIEW);
99+
glLoadIdentity();
100+
101+
/* 출력될 도형을 위한 좌표 설정 */
102+
GLfloat points[] = {
103+
-0.5f,-0.5f,-0.5f, /* 뒤좌하*/
104+
-0.5f, 0.5f,-0.5f, /* 뒤좌상 */
105+
0.5f, 0.5f,-0.5f, /* 뒤우상 */
106+
0.5f,-0.5f,-0.5f, /* 뒤우하 */
107+
-0.5f,-0.5f, 0.5f, /* 앞좌하 */
108+
-0.5f, 0.5f, 0.5f, /* 앞좌상 */
109+
0.5f, 0.5f, 0.5f, /* 앞우상 */
110+
0.5f,-0.5f, 0.5f /* 앞우하 */
111+
};
112+
113+
/* 12개의 삼각형을 위한 정점의 배열 인덱스 */
114+
GLubyte indices[] = {
115+
0,1,2, 0,2,3, /* 뒤면 */
116+
4,6,5, 4,7,6, /* 앞면 */
117+
0,4,5, 0,5,1, /* 좌면 */
118+
1,5,6, 1,6,2, /* 윗면 */
119+
2,6,7, 2,7,3, /* 우면 */
120+
3,7,4, 3,4,0 /* 하면 */
121+
};
122+
123+
/* 정점 배열 사용을 설정 */
124+
glEnableClientState(GL_VERTEX_ARRAY);
125+
126+
/* 그래픽 출력을 위한 정점 배열 사용에 대한 설정 */
127+
glVertexPointer(3, GL_FLOAT, 0, points);
128+
129+
/* 삼각형 12개를 드로잉(6*2) : 처리할 정점의 수 : 36개 */
130+
glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_BYTE, indices);
131+
132+
/* 그래픽 출력을 하고 나서 정점 배열 사용에 대한 설정 해제 */
133+
glDisableClientState(GL_VERTEX_ARRAY);
134+
135+
eglSwapBuffers(gDisplay, gSurface); /* OpenGL ES의 내용을 EGL로 출력 */
136+
137+
struct gbm_bo *currBo = gbm_surface_lock_front_buffer(gbmSurface);
138+
uint32_t handle = gbm_bo_get_handle(currBo).u32;
139+
uint32_t pitch = gbm_bo_get_stride(currBo);
140+
141+
drmModeAddFB(device, modeInfo.hdisplay, modeInfo.vdisplay, 24, 32, pitch, handle, &currFB);
142+
drmModeSetCrtc(device, crtc->crtc_id, currFB, 0, 0, &connector_id, 1, &modeInfo);
143+
144+
getchar();
145+
146+
/* DRM Crtc 원래 모드로 돌리기 */
147+
drmModeSetCrtc(device, crtc->crtc_id, crtc->buffer_id, crtc->x, crtc->y, &connector_id, 1, &crtc->mode);
148+
drmModeFreeCrtc(crtc);
149+
150+
/* 사용한 버퍼 해제 */
151+
if(currBo) {
152+
drmModeRmFB(device, currFB);
153+
gbm_surface_release_buffer(gbmSurface, currBo);
154+
}
155+
156+
/* GBM 장치 정리 */
157+
gbm_surface_destroy(gbmSurface);
158+
gbm_device_destroy(gbmDev);
159+
160+
/* DRM 장치 정리 */
161+
drmModeFreeConnector(connector);
162+
drmModeFreeResources(resources);
163+
164+
close(device);
165+
166+
return 0;
167+
}
168+

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /