d3d9: implement scissor test

This commit is contained in:
Brad Parker 2019-01-26 20:12:49 -05:00
parent 1546ba05d4
commit 8b6676e17f
3 changed files with 43 additions and 2 deletions

View File

@ -457,6 +457,12 @@ static INLINE void d3d9_set_viewports(LPDIRECT3DDEVICE9 dev,
IDirect3DDevice9_SetViewport(dev, (D3DVIEWPORT9*)vp);
}
static INLINE void d3d9_set_scissor_rect(
LPDIRECT3DDEVICE9 dev, RECT *rect)
{
IDirect3DDevice9_SetScissorRect(dev, rect);
}
static INLINE void d3d9_set_render_state(
LPDIRECT3DDEVICE9 dev, D3DRENDERSTATETYPE state, DWORD value)
{

View File

@ -1033,6 +1033,7 @@ static bool d3d9_initialize(d3d9_video_t *d3d, const video_info_t *info)
d3d_matrix_transpose(&d3d->mvp, &d3d->mvp_transposed);
d3d9_set_render_state(d3d->dev, D3DRS_CULLMODE, D3DCULL_NONE);
d3d9_set_render_state(d3d->dev, D3DRS_SCISSORTESTENABLE, TRUE);
return true;
}

View File

@ -309,6 +309,40 @@ static bool menu_display_d3d9_font_init_first(
return true;
}
void menu_display_d3d9_scissor_begin(video_frame_info_t *video_info, int x, int y, unsigned width, unsigned height)
{
RECT rect = {0};
d3d9_video_t *d3d9 = video_info ?
(d3d9_video_t*)video_info->userdata : NULL;
rect.left = x;
rect.top = y;
rect.right = width + x;
rect.bottom = height + y;
if (!d3d9 || !width || !height)
return;
d3d9_set_scissor_rect(d3d9->dev, &rect);
}
void menu_display_d3d9_scissor_end(video_frame_info_t *video_info)
{
RECT rect = {0};
d3d9_video_t *d3d9 = video_info ?
(d3d9_video_t*)video_info->userdata : NULL;
if (!d3d9)
return;
rect.left = d3d9->vp.x;
rect.top = d3d9->vp.y;
rect.right = d3d9->vp.width;
rect.bottom = d3d9->vp.height;
d3d9_set_scissor_rect(d3d9->dev, &rect);
}
menu_display_ctx_driver_t menu_display_ctx_d3d9 = {
menu_display_d3d9_draw,
menu_display_d3d9_draw_pipeline,
@ -324,6 +358,6 @@ menu_display_ctx_driver_t menu_display_ctx_d3d9 = {
MENU_VIDEO_DRIVER_DIRECT3D9,
"d3d9",
false,
NULL,
NULL
menu_display_d3d9_scissor_begin,
menu_display_d3d9_scissor_end
};