static void galahad_set_constant_buffer(struct pipe_context *_pipe, uint shader, uint index, struct pipe_resource *_resource) { struct galahad_context *glhd_pipe = galahad_context(_pipe); struct pipe_context *pipe = glhd_pipe->pipe; struct pipe_resource *unwrapped_resource; struct pipe_resource *resource = NULL; if (shader >= PIPE_SHADER_TYPES) { glhd_error("Unknown shader type %u", shader); } if (index && index >= pipe->screen->get_shader_param(pipe->screen, shader, PIPE_SHADER_CAP_MAX_CONST_BUFFERS)) { glhd_error("Access to constant buffer %u requested, " "but only %d are supported", index, pipe->screen->get_shader_param(pipe->screen, shader, PIPE_SHADER_CAP_MAX_CONST_BUFFERS)); } /* XXX hmm? unwrap the input state */ if (_resource) { unwrapped_resource = galahad_resource_unwrap(_resource); resource = unwrapped_resource; } pipe->set_constant_buffer(pipe, shader, index, resource); }
static void galahad_set_framebuffer_state(struct pipe_context *_pipe, const struct pipe_framebuffer_state *_state) { struct galahad_context *glhd_pipe = galahad_context(_pipe); struct pipe_context *pipe = glhd_pipe->pipe; struct pipe_framebuffer_state unwrapped_state; struct pipe_framebuffer_state *state = NULL; unsigned i; if (_state->nr_cbufs > PIPE_MAX_COLOR_BUFS) { glhd_error("%d render targets bound, but only %d are permitted by API", _state->nr_cbufs, PIPE_MAX_COLOR_BUFS); } else if (_state->nr_cbufs > pipe->screen->get_param(pipe->screen, PIPE_CAP_MAX_RENDER_TARGETS)) { glhd_warn("%d render targets bound, but only %d are supported", _state->nr_cbufs, pipe->screen->get_param(pipe->screen, PIPE_CAP_MAX_RENDER_TARGETS)); } /* unwrap the input state */ if (_state) { memcpy(&unwrapped_state, _state, sizeof(unwrapped_state)); for(i = 0; i < _state->nr_cbufs; i++) unwrapped_state.cbufs[i] = galahad_surface_unwrap(_state->cbufs[i]); for (; i < PIPE_MAX_COLOR_BUFS; i++) unwrapped_state.cbufs[i] = NULL; unwrapped_state.zsbuf = galahad_surface_unwrap(_state->zsbuf); state = &unwrapped_state; } pipe->set_framebuffer_state(pipe, state); }
static void galahad_context_bind_sampler_states(struct pipe_context *_pipe, unsigned shader, unsigned start, unsigned num_samplers, void **samplers) { struct galahad_context *glhd_pipe = galahad_context(_pipe); struct pipe_context *pipe = glhd_pipe->pipe; if (num_samplers > PIPE_MAX_SAMPLERS) { glhd_error("%u samplers requested, " "but only %u are permitted by API", num_samplers, PIPE_MAX_SAMPLERS); } switch (shader) { case PIPE_SHADER_VERTEX: pipe->bind_vertex_sampler_states(pipe, num_samplers, samplers); break; case PIPE_SHADER_FRAGMENT: pipe->bind_fragment_sampler_states(pipe, num_samplers, samplers); break; default: assert(0); } }
static struct pipe_query * galahad_create_query(struct pipe_context *_pipe, unsigned query_type) { struct galahad_context *glhd_pipe = galahad_context(_pipe); struct pipe_context *pipe = glhd_pipe->pipe; if (query_type == PIPE_QUERY_OCCLUSION_COUNTER && !pipe->screen->get_param(pipe->screen, PIPE_CAP_OCCLUSION_QUERY)) { glhd_error("Occlusion query requested but not supported"); } if (query_type == PIPE_QUERY_TIME_ELAPSED && !pipe->screen->get_param(pipe->screen, PIPE_CAP_TIMER_QUERY)) { glhd_error("Timer query requested but not supported"); } return pipe->create_query(pipe, query_type); }
static void galahad_bind_vertex_sampler_states(struct pipe_context *_pipe, unsigned num_samplers, void **samplers) { struct galahad_context *glhd_pipe = galahad_context(_pipe); struct pipe_context *pipe = glhd_pipe->pipe; if (num_samplers > PIPE_MAX_VERTEX_SAMPLERS) { glhd_error("%u vertex samplers requested, " "but only %u are permitted by API", num_samplers, PIPE_MAX_VERTEX_SAMPLERS); } pipe->bind_vertex_sampler_states(pipe, num_samplers, samplers); }