"Mutex"-coordinated bus in VHDL
First of all, this doesn't do what you think it does:
rgb_write : process(mask)
begin
   if mask = '1' then
      rgb &lt;= some_color;
   end if;
end process;

Instead of leaving rgb &quot;undriven&quot; when mask is low, it creates a latch. rgb simply retains its previous value when the condition is false.
Besides which, what happens if two or more of your shapes overlap?
What you need is a priority encoder that takes all of the mask signals as inputs and produces a number that indicates which shape should be displayed at any given position, and then a multiplexer that selects the color for that shape.



simulate this circuit &ndash; Schematic created using CircuitLab
The output of U1 is a two-bit number indicating which mask input is active with the highest priority; it is zero if none of the inputs are active. Note that the shape generators don't need to actually output a color at all, just a mask signal. The colors can be assigned separately at the mux inputs.
In HDL, these can be combined into a single process. The if - elsif structure implements the priority encoder, and the assignment statements implement the mux.
process (mask_vec)
begin
  if    mask_vec(0) = '1' then rgb &lt;= shape_0_color;
  elsif mask_vec(1) = '1' then rgb &lt;= shape_1_color;
  elsif mask_vec(2) = '1' then rgb &lt;= shape_2_color;
  else                         rgb &lt;= background_color;
  end if;
end process;