Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
小白菜888
Obs Studio
提交
3951babc
O
Obs Studio
项目概览
小白菜888
/
Obs Studio
通知
4
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
O
Obs Studio
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
3951babc
编写于
10月 11, 2013
作者:
J
jp9000
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
add GL index buffers and a few tweaks to the helper functions
上级
0a4592a4
变更
8
隐藏空白更改
内联
并排
Showing
8 changed file
with
165 addition
and
63 deletion
+165
-63
libobs-opengl/gl-helpers.c
libobs-opengl/gl-helpers.c
+24
-5
libobs-opengl/gl-helpers.h
libobs-opengl/gl-helpers.h
+4
-1
libobs-opengl/gl-indexbuffer.c
libobs-opengl/gl-indexbuffer.c
+102
-0
libobs-opengl/gl-subsystem.c
libobs-opengl/gl-subsystem.c
+1
-26
libobs-opengl/gl-subsystem.h
libobs-opengl/gl-subsystem.h
+12
-0
libobs-opengl/gl-vertexbuffer.c
libobs-opengl/gl-vertexbuffer.c
+18
-31
vs/2010/libobs-opengl/libobs-opengl.vcxproj
vs/2010/libobs-opengl/libobs-opengl.vcxproj
+1
-0
vs/2010/libobs-opengl/libobs-opengl.vcxproj.filters
vs/2010/libobs-opengl/libobs-opengl.vcxproj.filters
+3
-0
未找到文件。
libobs-opengl/gl-helpers.c
浏览文件 @
3951babc
...
...
@@ -80,18 +80,37 @@ bool gl_copy_texture(struct gs_device *device,
return
success
;
}
bool
gl_create_buffer
(
GL
uint
*
buffer
,
GLsizeiptr
size
,
const
GLvoid
*
data
,
GLenum
usage
)
bool
gl_create_buffer
(
GL
enum
target
,
GLuint
*
buffer
,
GLsizeiptr
size
,
const
GLvoid
*
data
,
GLenum
usage
)
{
bool
success
;
if
(
!
gl_gen_buffers
(
1
,
buffer
))
return
false
;
if
(
!
gl_bind_buffer
(
GL_ARRAY_BUFFER
,
*
buffer
))
if
(
!
gl_bind_buffer
(
target
,
*
buffer
))
return
false
;
glBufferData
(
GL_ARRAY_BUFFER
,
size
,
data
,
usage
);
glBufferData
(
target
,
size
,
data
,
usage
);
success
=
gl_success
(
"glBufferData"
);
gl_bind_buffer
(
GL_ARRAY_BUFFER
,
0
);
gl_bind_buffer
(
target
,
0
);
return
success
;
}
bool
update_buffer
(
GLenum
target
,
GLuint
buffer
,
void
*
data
,
size_t
size
)
{
void
*
ptr
;
bool
success
=
true
;
if
(
!
gl_bind_buffer
(
target
,
buffer
))
return
false
;
ptr
=
glMapBuffer
(
target
,
GL_WRITE_ONLY
);
success
=
gl_success
(
"glMapBuffer"
);
if
(
success
&&
ptr
)
{
memcpy
(
ptr
,
data
,
size
);
glUnmapBuffer
(
target
);
}
gl_bind_buffer
(
target
,
0
);
return
success
;
}
libobs-opengl/gl-helpers.h
浏览文件 @
3951babc
...
...
@@ -87,7 +87,10 @@ extern bool gl_copy_texture(struct gs_device *device,
GLuint
dst
,
GLenum
dst_target
,
uint32_t
width
,
uint32_t
height
);
extern
bool
gl_create_buffer
(
GLuint
*
buffer
,
GLsizeiptr
size
,
extern
bool
gl_create_buffer
(
GL
enum
target
,
GL
uint
*
buffer
,
GLsizeiptr
size
,
const
GLvoid
*
data
,
GLenum
usage
);
extern
bool
update_buffer
(
GLenum
target
,
GLuint
buffer
,
void
*
data
,
size_t
size
);
#endif
libobs-opengl/gl-indexbuffer.c
0 → 100644
浏览文件 @
3951babc
/******************************************************************************
Copyright (C) 2013 by Hugh Bailey <obs.jim@gmail.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
******************************************************************************/
#include "gl-subsystem.h"
static
inline
bool
init_ib
(
struct
gs_index_buffer
*
ib
)
{
GLenum
usage
=
ib
->
dynamic
?
GL_DYNAMIC_COPY
:
GL_STATIC_DRAW
;
bool
success
;
success
=
gl_create_buffer
(
GL_ARRAY_BUFFER
,
&
ib
->
buffer
,
ib
->
size
,
ib
->
data
,
usage
);
if
(
!
ib
->
dynamic
)
{
bfree
(
ib
->
data
);
ib
->
data
=
NULL
;
}
return
success
;
}
indexbuffer_t
device_create_indexbuffer
(
device_t
device
,
enum
gs_index_type
type
,
void
*
indices
,
size_t
num
,
uint32_t
flags
)
{
struct
gs_index_buffer
*
ib
=
bmalloc
(
sizeof
(
struct
gs_index_buffer
));
size_t
width
=
type
==
GS_UNSIGNED_LONG
?
sizeof
(
long
)
:
sizeof
(
short
);
memset
(
ib
,
0
,
sizeof
(
struct
gs_index_buffer
));
ib
->
device
=
device
;
ib
->
data
=
indices
;
ib
->
dynamic
=
flags
&
GS_DYNAMIC
;
ib
->
num
=
num
;
ib
->
size
=
width
*
num
;
ib
->
type
=
type
;
ib
->
gl_type
=
type
==
GS_UNSIGNED_LONG
?
GL_UNSIGNED_INT
:
GL_UNSIGNED_SHORT
;
if
(
!
init_ib
(
ib
))
{
blog
(
LOG_ERROR
,
"device_create_indexbuffer (GL) failed"
);
indexbuffer_destroy
(
ib
);
return
NULL
;
}
return
ib
;
}
void
indexbuffer_destroy
(
indexbuffer_t
ib
)
{
if
(
ib
)
{
if
(
ib
->
buffer
)
gl_delete_buffers
(
1
,
&
ib
->
buffer
);
bfree
(
ib
->
data
);
bfree
(
ib
);
}
}
void
indexbuffer_flush
(
indexbuffer_t
ib
)
{
if
(
!
ib
->
dynamic
)
{
blog
(
LOG_ERROR
,
"Index buffer is not dynamic"
);
goto
fail
;
}
if
(
!
update_buffer
(
GL_ARRAY_BUFFER
,
ib
->
buffer
,
ib
->
data
,
ib
->
size
))
goto
fail
;
return
;
fail:
blog
(
LOG_ERROR
,
"indexbuffer_flush (GL) failed"
);
}
void
*
indexbuffer_getdata
(
indexbuffer_t
ib
)
{
return
ib
->
data
;
}
size_t
indexbuffer_numindices
(
indexbuffer_t
ib
)
{
return
ib
->
num
;
}
enum
gs_index_type
indexbuffer_gettype
(
indexbuffer_t
ib
)
{
return
ib
->
type
;
}
libobs-opengl/gl-subsystem.c
浏览文件 @
3951babc
...
...
@@ -112,12 +112,6 @@ samplerstate_t device_create_samplerstate(device_t device,
return
sampler
;
}
indexbuffer_t
device_create_indexbuffer
(
device_t
device
,
enum
gs_index_type
type
,
void
*
indices
,
size_t
num
,
uint32_t
flags
)
{
}
enum
gs_texture_type
device_gettexturetype
(
device_t
device
,
texture_t
texture
)
{
...
...
@@ -357,24 +351,5 @@ enum gs_color_format volumetexture_getcolorformat(texture_t voltex)
void
samplerstate_destroy
(
samplerstate_t
samplerstate
)
{
}
void
indexbuffer_destroy
(
indexbuffer_t
indexbuffer
)
{
}
void
indexbuffer_flush
(
indexbuffer_t
indexbuffer
)
{
}
void
*
indexbuffer_getdata
(
indexbuffer_t
indexbuffer
)
{
}
size_t
indexbuffer_numindices
(
indexbuffer_t
indexbuffer
)
{
}
enum
gs_index_type
indexbuffer_gettype
(
indexbuffer_t
indexbuffer
)
{
bfree
(
samplerstate
);
}
libobs-opengl/gl-subsystem.h
浏览文件 @
3951babc
...
...
@@ -232,6 +232,18 @@ struct gs_vertex_buffer {
struct
vb_data
*
data
;
};
struct
gs_index_buffer
{
GLuint
buffer
;
enum
gs_index_type
type
;
GLuint
gl_type
;
device_t
device
;
void
*
data
;
size_t
num
;
size_t
size
;
bool
dynamic
;
};
struct
gs_texture
{
device_t
device
;
enum
gs_texture_type
type
;
...
...
libobs-opengl/gl-vertexbuffer.c
浏览文件 @
3951babc
...
...
@@ -18,51 +18,32 @@
#include "graphics/vec3.h"
#include "gl-subsystem.h"
static
bool
update_buffer
(
GLuint
buffer
,
void
*
data
,
size_t
size
)
{
void
*
ptr
;
bool
success
=
true
;
if
(
!
gl_bind_buffer
(
GL_ARRAY_BUFFER
,
buffer
))
return
false
;
ptr
=
glMapBuffer
(
GL_ARRAY_BUFFER
,
GL_WRITE_ONLY
);
success
=
gl_success
(
"glMapBuffer"
);
if
(
success
&&
ptr
)
{
memcpy
(
ptr
,
data
,
size
);
glUnmapBuffer
(
GL_ARRAY_BUFFER
);
}
gl_bind_buffer
(
GL_ARRAY_BUFFER
,
0
);
return
success
;
}
static
bool
init_vb
(
struct
gs_vertex_buffer
*
vb
)
{
GLenum
usage
=
vb
->
dynamic
?
GL_DYNAMIC_COPY
:
GL_STATIC_DRAW
;
size_t
i
;
if
(
!
gl_create_buffer
(
&
vb
->
vertex_buffer
,
if
(
!
gl_create_buffer
(
GL_ARRAY_BUFFER
,
&
vb
->
vertex_buffer
,
vb
->
data
->
num
*
sizeof
(
struct
vec3
),
vb
->
data
->
points
,
usage
))
return
false
;
if
(
vb
->
data
->
normals
)
{
if
(
!
gl_create_buffer
(
&
vb
->
normal_buffer
,
if
(
!
gl_create_buffer
(
GL_ARRAY_BUFFER
,
&
vb
->
normal_buffer
,
vb
->
data
->
num
*
sizeof
(
struct
vec3
),
vb
->
data
->
normals
,
usage
))
return
false
;
}
if
(
vb
->
data
->
tangents
)
{
if
(
!
gl_create_buffer
(
&
vb
->
tangent_buffer
,
if
(
!
gl_create_buffer
(
GL_ARRAY_BUFFER
,
&
vb
->
tangent_buffer
,
vb
->
data
->
num
*
sizeof
(
struct
vec3
),
vb
->
data
->
tangents
,
usage
))
return
false
;
}
if
(
vb
->
data
->
colors
)
{
if
(
!
gl_create_buffer
(
&
vb
->
color_buffer
,
if
(
!
gl_create_buffer
(
GL_ARRAY_BUFFER
,
&
vb
->
color_buffer
,
vb
->
data
->
num
*
sizeof
(
uint32_t
),
vb
->
data
->
colors
,
usage
))
return
false
;
...
...
@@ -75,7 +56,8 @@ static bool init_vb(struct gs_vertex_buffer *vb)
struct
tvertarray
*
tv
=
vb
->
data
->
tvarray
+
i
;
size_t
size
=
vb
->
data
->
num
*
sizeof
(
float
)
*
tv
->
width
;
if
(
!
gl_create_buffer
(
&
tex_buffer
,
size
,
tv
->
array
,
usage
))
if
(
!
gl_create_buffer
(
GL_ARRAY_BUFFER
,
&
tex_buffer
,
size
,
tv
->
array
,
usage
))
return
false
;
da_push_back
(
vb
->
uv_buffers
,
&
tex_buffer
);
...
...
@@ -95,8 +77,9 @@ vertbuffer_t device_create_vertexbuffer(device_t device,
struct
gs_vertex_buffer
*
vb
=
bmalloc
(
sizeof
(
struct
gs_vertex_buffer
));
memset
(
vb
,
0
,
sizeof
(
struct
gs_vertex_buffer
));
vb
->
data
=
data
;
vb
->
dynamic
=
flags
&
GS_DYNAMIC
;
vb
->
device
=
device
;
vb
->
data
=
data
;
vb
->
dynamic
=
flags
&
GS_DYNAMIC
;
if
(
!
init_vb
(
vb
))
{
blog
(
LOG_ERROR
,
"device_create_vertexbuffer (GL) failed"
);
...
...
@@ -142,24 +125,28 @@ void vertexbuffer_flush(vertbuffer_t vb, bool rebuild)
goto
failed
;
}
if
(
!
update_buffer
(
vb
->
vertex_buffer
,
vb
->
data
->
points
,
if
(
!
update_buffer
(
GL_ARRAY_BUFFER
,
vb
->
vertex_buffer
,
vb
->
data
->
points
,
vb
->
data
->
num
*
sizeof
(
struct
vec3
)))
goto
failed
;
if
(
vb
->
normal_buffer
)
{
if
(
!
update_buffer
(
vb
->
normal_buffer
,
vb
->
data
->
normals
,
if
(
!
update_buffer
(
GL_ARRAY_BUFFER
,
vb
->
normal_buffer
,
vb
->
data
->
normals
,
vb
->
data
->
num
*
sizeof
(
struct
vec3
)))
goto
failed
;
}
if
(
vb
->
tangent_buffer
)
{
if
(
!
update_buffer
(
vb
->
tangent_buffer
,
vb
->
data
->
tangents
,
if
(
!
update_buffer
(
GL_ARRAY_BUFFER
,
vb
->
tangent_buffer
,
vb
->
data
->
tangents
,
vb
->
data
->
num
*
sizeof
(
struct
vec3
)))
goto
failed
;
}
if
(
vb
->
color_buffer
)
{
if
(
!
update_buffer
(
vb
->
color_buffer
,
vb
->
data
->
colors
,
if
(
!
update_buffer
(
GL_ARRAY_BUFFER
,
vb
->
color_buffer
,
vb
->
data
->
colors
,
vb
->
data
->
num
*
sizeof
(
uint32_t
)))
goto
failed
;
}
...
...
@@ -169,7 +156,7 @@ void vertexbuffer_flush(vertbuffer_t vb, bool rebuild)
struct
tvertarray
*
tv
=
vb
->
data
->
tvarray
+
i
;
size_t
size
=
vb
->
data
->
num
*
tv
->
width
*
sizeof
(
float
);
if
(
!
update_buffer
(
buffer
,
tv
->
array
,
size
))
if
(
!
update_buffer
(
GL_ARRAY_BUFFER
,
buffer
,
tv
->
array
,
size
))
goto
failed
;
}
...
...
vs/2010/libobs-opengl/libobs-opengl.vcxproj
浏览文件 @
3951babc
...
...
@@ -162,6 +162,7 @@
</ItemGroup>
<ItemGroup>
<ClCompile
Include=
"..\..\..\libobs-opengl\gl-helpers.c"
/>
<ClCompile
Include=
"..\..\..\libobs-opengl\gl-indexbuffer.c"
/>
<ClCompile
Include=
"..\..\..\libobs-opengl\gl-shader.c"
/>
<ClCompile
Include=
"..\..\..\libobs-opengl\gl-shaderparser.c"
/>
<ClCompile
Include=
"..\..\..\libobs-opengl\gl-stagesurf.c"
/>
...
...
vs/2010/libobs-opengl/libobs-opengl.vcxproj.filters
浏览文件 @
3951babc
...
...
@@ -59,5 +59,8 @@
<ClCompile
Include=
"..\..\..\libobs-opengl\gl-vertexbuffer.c"
>
<Filter>
Source Files
</Filter>
</ClCompile>
<ClCompile
Include=
"..\..\..\libobs-opengl\gl-indexbuffer.c"
>
<Filter>
Source Files
</Filter>
</ClCompile>
</ItemGroup>
</Project>
\ No newline at end of file
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录