Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
ed75f5ca
Commit
ed75f5ca
authored
May 04, 2010
by
Henri Verbeet
Committed by
Alexandre Julliard
May 05, 2010
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
wined3d: Setup the FBO for the correct target in context_apply_clear_state().
parent
4056f4bf
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
53 additions
and
36 deletions
+53
-36
context.c
dlls/wined3d/context.c
+49
-12
device.c
dlls/wined3d/device.c
+1
-23
wined3d_private.h
dlls/wined3d/wined3d_private.h
+3
-1
No files found.
dlls/wined3d/context.c
View file @
ed75f5ca
...
...
@@ -455,7 +455,7 @@ static void context_apply_fbo_state(struct wined3d_context *context, GLenum targ
context
->
rebind_fbo
=
FALSE
;
}
if
(
context
->
render_offscreen
)
if
(
render_targets
)
{
context
->
current_fbo
=
context_find_fbo_entry
(
context
,
target
,
render_targets
,
depth_stencil
);
context_apply_fbo_entry
(
context
,
target
,
context
->
current_fbo
);
...
...
@@ -469,6 +469,21 @@ static void context_apply_fbo_state(struct wined3d_context *context, GLenum targ
context_check_fbo_status
(
context
,
target
);
}
/* GL locking is done by the caller */
static
void
context_apply_fbo_state_blit
(
struct
wined3d_context
*
context
,
GLenum
target
,
IWineD3DSurfaceImpl
*
render_target
,
IWineD3DSurfaceImpl
*
depth_stencil
)
{
if
(
surface_is_offscreen
(
render_target
))
{
context
->
blit_targets
[
0
]
=
render_target
;
context_apply_fbo_state
(
context
,
target
,
context
->
blit_targets
,
depth_stencil
);
}
else
{
context_apply_fbo_state
(
context
,
target
,
NULL
,
NULL
);
}
}
/* Context activation is done by the caller. */
void
context_alloc_occlusion_query
(
struct
wined3d_context
*
context
,
struct
wined3d_occlusion_query
*
query
)
{
...
...
@@ -1357,6 +1372,10 @@ struct wined3d_context *context_create(IWineD3DSwapChainImpl *swapchain, IWineD3
sizeof
(
*
ret
->
pshader_const_dirty
)
*
device
->
d3d_pshader_constantF
);
}
ret
->
blit_targets
=
HeapAlloc
(
GetProcessHeap
(),
HEAP_ZERO_MEMORY
,
gl_info
->
limits
.
buffers
*
sizeof
(
*
ret
->
blit_targets
));
if
(
!
ret
->
blit_targets
)
goto
out
;
ret
->
free_occlusion_query_size
=
4
;
ret
->
free_occlusion_queries
=
HeapAlloc
(
GetProcessHeap
(),
0
,
ret
->
free_occlusion_query_size
*
sizeof
(
*
ret
->
free_occlusion_queries
));
...
...
@@ -1490,6 +1509,7 @@ struct wined3d_context *context_create(IWineD3DSwapChainImpl *swapchain, IWineD3
out:
HeapFree
(
GetProcessHeap
(),
0
,
ret
->
free_event_queries
);
HeapFree
(
GetProcessHeap
(),
0
,
ret
->
free_occlusion_queries
);
HeapFree
(
GetProcessHeap
(),
0
,
ret
->
blit_targets
);
HeapFree
(
GetProcessHeap
(),
0
,
ret
->
pshader_const_dirty
);
HeapFree
(
GetProcessHeap
(),
0
,
ret
->
vshader_const_dirty
);
HeapFree
(
GetProcessHeap
(),
0
,
ret
);
...
...
@@ -1524,6 +1544,7 @@ void context_destroy(IWineD3DDeviceImpl *This, struct wined3d_context *context)
destroy
=
FALSE
;
}
HeapFree
(
GetProcessHeap
(),
0
,
context
->
blit_targets
);
HeapFree
(
GetProcessHeap
(),
0
,
context
->
vshader_const_dirty
);
HeapFree
(
GetProcessHeap
(),
0
,
context
->
pshader_const_dirty
);
device_context_remove
(
This
,
context
);
...
...
@@ -2010,23 +2031,30 @@ void context_apply_blit_state(struct wined3d_context *context, IWineD3DDeviceImp
}
/* Context activation is done by the caller. */
void
context_apply_clear_state
(
struct
wined3d_context
*
context
,
IWineD3DDeviceImpl
*
device
)
void
context_apply_clear_state
(
struct
wined3d_context
*
context
,
IWineD3DDeviceImpl
*
device
,
IWineD3DSurfaceImpl
*
render_target
,
IWineD3DSurfaceImpl
*
depth_stencil
)
{
const
struct
StateEntry
*
state_table
=
device
->
StateTable
;
GLenum
buffer
;
if
(
wined3d_settings
.
offscreen_rendering_mode
==
ORM_FBO
)
{
if
(
!
context
->
render_offscreen
)
context_validate_onscreen_formats
(
device
,
context
);
ENTER_GL
();
context_apply_fbo_state
(
context
,
GL_FRAMEBUFFER
,
device
->
render_targets
,
device
->
depth_stencil
);
context_apply_fbo_state
_blit
(
context
,
GL_FRAMEBUFFER
,
render_target
,
depth_stencil
);
LEAVE_GL
();
}
if
(
context
->
draw_buffer_dirty
)
{
context_apply_draw_buffer
(
context
,
FALSE
);
context
->
draw_buffer_dirty
=
FALSE
;
}
if
(
!
surface_is_offscreen
(
render_target
))
buffer
=
surface_get_gl_buffer
(
render_target
);
else
if
(
wined3d_settings
.
offscreen_rendering_mode
==
ORM_FBO
)
buffer
=
GL_COLOR_ATTACHMENT0
;
else
buffer
=
device
->
offscreenBuffer
;
ENTER_GL
();
context_set_draw_buffer
(
context
,
buffer
);
LEAVE_GL
();
if
(
context
->
last_was_blit
)
{
...
...
@@ -2056,10 +2084,19 @@ void context_apply_draw_state(struct wined3d_context *context, IWineD3DDeviceImp
if
(
wined3d_settings
.
offscreen_rendering_mode
==
ORM_FBO
)
{
if
(
!
context
->
render_offscreen
)
context_validate_onscreen_formats
(
device
,
context
);
ENTER_GL
();
context_apply_fbo_state
(
context
,
GL_FRAMEBUFFER
,
device
->
render_targets
,
device
->
depth_stencil
);
LEAVE_GL
();
if
(
!
context
->
render_offscreen
)
{
context_validate_onscreen_formats
(
device
,
context
);
ENTER_GL
();
context_apply_fbo_state
(
context
,
GL_FRAMEBUFFER
,
NULL
,
NULL
);
LEAVE_GL
();
}
else
{
ENTER_GL
();
context_apply_fbo_state
(
context
,
GL_FRAMEBUFFER
,
device
->
render_targets
,
device
->
depth_stencil
);
LEAVE_GL
();
}
}
if
(
context
->
draw_buffer_dirty
)
...
...
dlls/wined3d/device.c
View file @
ed75f5ca
...
...
@@ -4455,29 +4455,7 @@ HRESULT IWineD3DDeviceImpl_ClearSurface(IWineD3DDeviceImpl *This, IWineD3DSurfac
return
WINED3D_OK
;
}
context_apply_clear_state
(
context
,
This
);
if
(
wined3d_settings
.
offscreen_rendering_mode
==
ORM_FBO
)
{
if
(
!
surface_is_offscreen
(
target
))
{
TRACE
(
"Surface %p is onscreen
\n
"
,
target
);
ENTER_GL
();
context_bind_fbo
(
context
,
GL_FRAMEBUFFER
,
NULL
);
context_set_draw_buffer
(
context
,
surface_get_gl_buffer
(
target
));
LEAVE_GL
();
}
else
{
TRACE
(
"Surface %p is offscreen
\n
"
,
target
);
ENTER_GL
();
context_bind_fbo
(
context
,
GL_FRAMEBUFFER
,
&
context
->
dst_fbo
);
context_attach_surface_fbo
(
context
,
GL_FRAMEBUFFER
,
0
,
target
);
context_attach_depth_stencil_fbo
(
context
,
GL_FRAMEBUFFER
,
depth_stencil
,
TRUE
);
LEAVE_GL
();
}
}
context_apply_clear_state
(
context
,
This
,
target
,
depth_stencil
);
target
->
get_drawable_size
(
context
,
&
drawable_width
,
&
drawable_height
);
...
...
dlls/wined3d/wined3d_private.h
View file @
ed75f5ca
...
...
@@ -1092,6 +1092,7 @@ struct wined3d_context
GLuint
fbo_read_binding
;
GLuint
fbo_draw_binding
;
BOOL
rebind_fbo
;
IWineD3DSurfaceImpl
**
blit_targets
;
/* Queries */
GLuint
*
free_occlusion_queries
;
...
...
@@ -1192,7 +1193,8 @@ void context_alloc_event_query(struct wined3d_context *context,
void
context_alloc_occlusion_query
(
struct
wined3d_context
*
context
,
struct
wined3d_occlusion_query
*
query
)
DECLSPEC_HIDDEN
;
void
context_apply_blit_state
(
struct
wined3d_context
*
context
,
IWineD3DDeviceImpl
*
device
)
DECLSPEC_HIDDEN
;
void
context_apply_clear_state
(
struct
wined3d_context
*
context
,
IWineD3DDeviceImpl
*
device
)
DECLSPEC_HIDDEN
;
void
context_apply_clear_state
(
struct
wined3d_context
*
context
,
IWineD3DDeviceImpl
*
device
,
IWineD3DSurfaceImpl
*
render_target
,
IWineD3DSurfaceImpl
*
depth_stencil
)
DECLSPEC_HIDDEN
;
void
context_apply_draw_state
(
struct
wined3d_context
*
context
,
IWineD3DDeviceImpl
*
device
)
DECLSPEC_HIDDEN
;
void
context_attach_depth_stencil_fbo
(
struct
wined3d_context
*
context
,
GLenum
fbo_target
,
IWineD3DSurfaceImpl
*
depth_stencil
,
BOOL
use_render_buffer
)
DECLSPEC_HIDDEN
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment