st/nine: Back RT to nine_context

Part of the refactor to move all gallium calls to
nine_state.c, and have all internal states required
for those calls in nine_context.

Signed-off-by: Axel Davy <axel.davy@ens.fr>
This commit is contained in:
Axel Davy
2016-10-19 21:38:47 +02:00
parent aafbd62955
commit 7f6e01052b
4 changed files with 54 additions and 25 deletions
+5 -11
View File
@@ -255,6 +255,7 @@ NineDevice9_ctor( struct NineDevice9 *This,
if (FAILED(hr))
return hr;
NineUnknown_ConvertRefToBind(NineUnknown(This->state.rt[i]));
nine_bind(&This->context.rt[i], This->state.rt[i]);
}
/* Initialize a dummy VBO to be used when a vertex declaration does not
@@ -1857,19 +1858,12 @@ NineDevice9_SetRenderTarget( struct NineDevice9 *This,
This->state.scissor.miny = 0;
This->state.scissor.maxx = rt->desc.Width;
This->state.scissor.maxy = rt->desc.Height;
This->state.changed.group |= NINE_STATE_VIEWPORT | NINE_STATE_SCISSOR | NINE_STATE_MULTISAMPLE;
if (This->state.rt[0] &&
(This->state.rt[0]->desc.MultiSampleType <= D3DMULTISAMPLE_NONMASKABLE) !=
(rt->desc.MultiSampleType <= D3DMULTISAMPLE_NONMASKABLE))
This->state.changed.group |= NINE_STATE_SAMPLE_MASK;
}
if (This->state.rt[i] != NineSurface9(pRenderTarget)) {
nine_bind(&This->state.rt[i], pRenderTarget);
This->state.changed.group |= NINE_STATE_FB;
}
if (This->state.rt[i] != NineSurface9(pRenderTarget))
nine_bind(&This->state.rt[i], pRenderTarget);
nine_context_set_render_target(This, i, rt);
return D3D_OK;
}
+41 -13
View File
@@ -50,7 +50,7 @@ check_multisample(struct NineDevice9 *device)
{
DWORD *rs = device->context.rs;
DWORD new_value = (rs[D3DRS_ZENABLE] || rs[D3DRS_STENCILENABLE]) &&
device->state.rt[0]->desc.MultiSampleType >= 1 &&
device->context.rt[0]->desc.MultiSampleType >= 1 &&
rs[D3DRS_MULTISAMPLEANTIALIAS];
if (rs[NINED3DRS_MULTISAMPLE] != new_value) {
rs[NINED3DRS_MULTISAMPLE] = new_value;
@@ -422,7 +422,7 @@ update_framebuffer(struct NineDevice9 *device, bool is_clear)
struct nine_context *context = &device->context;
struct pipe_framebuffer_state *fb = &context->pipe.fb;
unsigned i;
struct NineSurface9 *rt0 = state->rt[0];
struct NineSurface9 *rt0 = context->rt[0];
unsigned w = rt0->desc.Width;
unsigned h = rt0->desc.Height;
unsigned nr_samples = rt0->base.info.nr_samples;
@@ -452,7 +452,7 @@ update_framebuffer(struct NineDevice9 *device, bool is_clear)
}
for (i = 0; i < device->caps.NumSimultaneousRTs; ++i) {
struct NineSurface9 *rt = state->rt[i];
struct NineSurface9 *rt = context->rt[i];
if (rt && rt->desc.Format != D3DFMT_NULL && (mask & (1 << i)) &&
rt->desc.Width == w && rt->desc.Height == h &&
@@ -1042,7 +1042,7 @@ nine_update_state(struct NineDevice9 *device)
pipe->set_blend_color(pipe, &color);
}
if (group & NINE_STATE_SAMPLE_MASK) {
if (state->rt[0]->desc.MultiSampleType <= D3DMULTISAMPLE_NONMASKABLE) {
if (context->rt[0]->desc.MultiSampleType <= D3DMULTISAMPLE_NONMASKABLE) {
pipe->set_sample_mask(pipe, ~0);
} else {
pipe->set_sample_mask(pipe, context->rs[D3DRS_MULTISAMPLEMASK]);
@@ -1431,6 +1431,31 @@ nine_context_set_pixel_shader_constant_b(struct NineDevice9 *device,
state->changed.group |= NINE_STATE_PS_CONST;
}
void
nine_context_set_render_target(struct NineDevice9 *device,
DWORD RenderTargetIndex,
struct NineSurface9 *rt)
{
struct nine_state *state = &device->state;
struct nine_context *context = &device->context;
const unsigned i = RenderTargetIndex;
if (i == 0) {
/* viewport and scissor changes */
state->changed.group |= NINE_STATE_VIEWPORT | NINE_STATE_SCISSOR | NINE_STATE_MULTISAMPLE;
if (context->rt[0] &&
(context->rt[0]->desc.MultiSampleType <= D3DMULTISAMPLE_NONMASKABLE) !=
(rt->desc.MultiSampleType <= D3DMULTISAMPLE_NONMASKABLE))
state->changed.group |= NINE_STATE_SAMPLE_MASK;
}
if (context->rt[i] != rt) {
nine_bind(&context->rt[i], rt);
state->changed.group |= NINE_STATE_FB;
}
}
void
nine_context_apply_stateblock(struct NineDevice9 *device,
const struct nine_state *src)
@@ -1603,7 +1628,8 @@ nine_context_clear_fb(struct NineDevice9 *device,
float Z,
DWORD Stencil)
{
const int sRGB = device->context.rs[D3DRS_SRGBWRITEENABLE] ? 1 : 0;
struct nine_context *context = &device->context;
const int sRGB = context->rs[D3DRS_SRGBWRITEENABLE] ? 1 : 0;
struct pipe_surface *cbuf, *zsbuf;
struct pipe_context *pipe = device->pipe;
struct NineSurface9 *zsbuf_surf = device->state.ds;
@@ -1618,7 +1644,7 @@ nine_context_clear_fb(struct NineDevice9 *device,
if (Flags & D3DCLEAR_TARGET) bufs |= PIPE_CLEAR_COLOR;
/* Ignore Z buffer if not bound */
if (device->context.pipe.fb.zsbuf != NULL) {
if (context->pipe.fb.zsbuf != NULL) {
if (Flags & D3DCLEAR_ZBUFFER) bufs |= PIPE_CLEAR_DEPTH;
if (Flags & D3DCLEAR_STENCIL) bufs |= PIPE_CLEAR_STENCIL;
}
@@ -1632,7 +1658,7 @@ nine_context_clear_fb(struct NineDevice9 *device,
rect.y2 = device->state.viewport.Height + rect.y1;
/* Both rectangles apply, which is weird, but that's D3D9. */
if (device->context.rs[D3DRS_SCISSORTESTENABLE]) {
if (context->rs[D3DRS_SCISSORTESTENABLE]) {
rect.x1 = MAX2(rect.x1, device->state.scissor.minx);
rect.y1 = MAX2(rect.y1, device->state.scissor.miny);
rect.x2 = MIN2(rect.x2, device->state.scissor.maxx);
@@ -1649,22 +1675,22 @@ nine_context_clear_fb(struct NineDevice9 *device,
}
}
if (rect.x1 >= device->context.pipe.fb.width || rect.y1 >= device->context.pipe.fb.height)
if (rect.x1 >= context->pipe.fb.width || rect.y1 >= context->pipe.fb.height)
return;
for (i = 0; i < device->caps.NumSimultaneousRTs; ++i) {
if (device->state.rt[i] && device->state.rt[i]->desc.Format != D3DFMT_NULL)
if (context->rt[i] && context->rt[i]->desc.Format != D3DFMT_NULL)
rt_mask |= 1 << i;
}
/* fast path, clears everything at once */
if (!Count &&
(!(bufs & PIPE_CLEAR_COLOR) || (rt_mask == device->context.rt_mask)) &&
(!(bufs & PIPE_CLEAR_COLOR) || (rt_mask == context->rt_mask)) &&
rect.x1 == 0 && rect.y1 == 0 &&
/* Case we clear only render target. Check clear region vs rt. */
((!(bufs & (PIPE_CLEAR_DEPTH | PIPE_CLEAR_STENCIL)) &&
rect.x2 >= device->context.pipe.fb.width &&
rect.y2 >= device->context.pipe.fb.height) ||
rect.x2 >= context->pipe.fb.width &&
rect.y2 >= context->pipe.fb.height) ||
/* Case we clear depth buffer (and eventually rt too).
* depth buffer size is always >= rt size. Compare to clear region */
((bufs & (PIPE_CLEAR_DEPTH | PIPE_CLEAR_STENCIL)) &&
@@ -1681,7 +1707,7 @@ nine_context_clear_fb(struct NineDevice9 *device,
}
for (i = 0; i < device->caps.NumSimultaneousRTs; ++i) {
rt = device->state.rt[i];
rt = context->rt[i];
if (!rt || rt->desc.Format == D3DFMT_NULL ||
!(bufs & PIPE_CLEAR_COLOR))
continue; /* save space, compiler should hoist this */
@@ -2116,6 +2142,8 @@ nine_context_clear(struct nine_context *context)
{
unsigned i;
for (i = 0; i < ARRAY_SIZE(context->rt); ++i)
nine_bind(&context->rt[i], NULL);
nine_bind(&context->vs, NULL);
nine_bind(&context->vdecl, NULL);
for (i = 0; i < PIPE_MAX_ATTRIBS; ++i)
@@ -229,6 +229,8 @@ struct nine_context {
uint32_t bumpmap_vars[6 * NINE_MAX_TEXTURE_STAGES];
struct NineSurface9 *rt[NINE_MAX_SIMULTANEOUS_RENDERTARGETS];
struct {
void *vs;
void *ps;
@@ -380,6 +382,11 @@ nine_context_set_pixel_shader_constant_b(struct NineDevice9 *device,
const BOOL *pConstantData,
UINT BoolCount);
void
nine_context_set_render_target(struct NineDevice9 *device,
DWORD RenderTargetIndex,
struct NineSurface9 *rt);
void
nine_context_apply_stateblock(struct NineDevice9 *device,
const struct nine_state *src);
@@ -95,7 +95,7 @@ NinePixelShader9_UpdateKey( struct NinePixelShader9 *ps,
}
/* centroid interpolation automatically used for color ps inputs */
if (state->rt[0]->base.info.nr_samples)
if (context->rt[0]->base.info.nr_samples)
key |= ((uint64_t)1) << 34;
if (unlikely(ps->byte_code.version < 0x14)) {